2015-04-23 2 views
0

В редких случаях моя программа вылетает после завершения установки обновлений. Это просто дает мне: «Ошибка ProgramName перестала отвечать» и сбой. Я знаю, что это должно быть что-то где-то в методе установки моего обновления Windows, но я не могу понять, что и где ошибка.fVB.NET Сбой при обновлении Windows после установки обновлений

Возможно, кто-то, у кого есть немного больше информации о WUAPI.dll, может помочь мне?

Программа запускается с USB-накопителя, и я иногда могу «исправить» проблему, просто переместив программу на рабочий стол и запустив ее оттуда, но я хочу избежать для этого. И AFAIK, ни один из моих кодов не обращается к USB-накопителю или не нуждается в доступе к программе на USB-накопителе во время процесса установки обновления. Конечно, я могу просто быть что-то довольно основной хватает ..

#Region "Installation method" 
    Public Sub iInstallation() 

     Progression = "UpdateInstall" 
     iUpdateInstaller = TryCast(UpdateSession.CreateUpdateInstaller(), IUpdateInstaller) 
     iUpdateInstaller.Updates = NewUpdatesCollection 

     iInstallationJob = iUpdateInstaller.BeginInstall(New iUpdateInstaller_onProgressChanged(Me), New iUpdateInstaller_onCompleted(Me), New iUpdateInstaller_state(Me)) 
    End Sub 
    Public Sub iInstallationComplete() 
     Try 
      Progression = "InstallComplete" 
      iDownloadJob.CleanUp() 
      iInstallationResult = iUpdateInstaller.EndInstall(iInstallationJob) 
      InvokeUIChangeText = "Installation Complete..." 
      InvokeUIChange() 

      If iInstallationResult.ResultCode = OperationResultCode.orcSucceeded Or iInstallationResult.ResultCode = OperationResultCode.orcSucceededWithErrors Then 

        message = "Installation done. " & iInstallationJob.Updates.Count & " Updates installed" 
        caption = "Installation Successfull" 
        buttons = MessageBoxButtons.OK 
        ikon = MessageBoxIcon.Information 
        MessageBox.Show(message, caption, buttons, ikon) 
        Me.Close() 


      Else 

       message = "One or more installations failed to install." 
       caption = "Installation failure" 
       buttons = MessageBoxButtons.OK 
       ikon = MessageBoxIcon.[Error] 
       MessageBox.Show(message, caption, buttons, ikon) 
       Me.Close() 


      End If 
     Catch err As Exception 
      MsgBox(err.Message) 
     End Try 
    End Sub 
    Public Class iUpdateInstaller_onProgressChanged 
     Implements IInstallationProgressChangedCallback 
     Private form1 As WUAPIProgress 

     Public Sub New(mainForm As WUAPIProgress) 
      Me.form1 = mainForm 
     End Sub 

     Public Sub Invoke(installationJob As IInstallationJob, e As IInstallationProgressChangedCallbackArgs) Implements IInstallationProgressChangedCallback.Invoke 
      Dim x As Integer = e.Progress.CurrentUpdatePercentComplete 
      form1.Invoke(Sub() 

          form1.Action.Text = "Installere opdatering " & e.Progress.CurrentUpdateIndex + 1 & "/" & installationJob.Updates.Count & " " & installationJob.Updates.Item(e.Progress.CurrentUpdateIndex + 1).Title 
          form1.ProgressBar1.Value = x 
          form1.Refresh() 

         End Sub) 
     End Sub 
    End Class 
    Public Class iUpdateInstaller_onCompleted 
     Implements IInstallationCompletedCallback 

     Private form1 As WUAPIProgress 

     Public Sub New(mainForm As WUAPIProgress) 
      Me.form1 = mainForm 
     End Sub 

     Public Sub Invoke(installationJob As WUApiLib.IInstallationJob, callbackArgs As IInstallationCompletedCallbackArgs) Implements IInstallationCompletedCallback.Invoke 
      form1.iInstallationComplete() 
     End Sub 
    End Class 

    Public Class iUpdateInstaller_state 
     Private form1 As WUAPIProgress 

     Public Sub New(mainForm As WUAPIProgress) 
      Me.form1 = mainForm 
      msgbox("Starting installation") 
     End Sub 
    End Class 
#End Region 

Может быть, стоит отметить, я следующее при закрытии формы и образуют замкнутые события

Private Sub WUAPIProgress_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 
    Try 


     Dim AutoUpdate = My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\", True) 
     AutoUpdate.SetValue("AUOptions", 4) 
     If Progression = "UpdateSearch" Or Progression = "SearchComplete" Then 


      iSearchJob.RequestAbort() 


     ElseIf Progression = "UpdateDownload" Or Progression = "UpdateComplete" Then 
      iDownloadJob.RequestAbort() 



     ElseIf Progression = "UpdateInstall" Or Progression = "InstallComplete" Then 


      iInstallationJob.RequestAbort() 

     End If 



    Catch err As Exception 
     MsgBox(err.Message) 
    End Try 
End Sub 

И:

Private Sub WUAPIProgress_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed 
    Me.Dispose() 
End Sub 

Думал, что у меня был выход ошибки, к сожалению, в конце концов. Это было связано с чем-то другим.

Edit:

код ловли по всему миру:

Namespace My 

' The following events are available for MyApplication: 
' 
' Startup: Raised when the application starts, before the startup form is created. 
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally. 
' UnhandledException: Raised if the application encounters an unhandled exception. 
' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected. 
Partial Friend Class MyApplication 

    Private Delegate Sub SafeApplicationThreadException(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs) 

    Private Sub ShowDebugOutput(ByVal ex As Exception) 

     Dim frmD As New frmDebug() 
     frmD.rtfError.AppendText(ex.ToString()) 
     frmD.ShowDialog() 

     Environment.Exit(0) 

    End Sub 

    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup 


     AddHandler System.Windows.Forms.Application.ThreadException, AddressOf app_ThreadException 


     AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AppDomain_UnhandledException 
    End Sub 

    Private Sub app_ThreadException(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs) 


     If MainForm.InvokeRequired Then 

      MainForm.Invoke(New SafeApplicationThreadException(AddressOf app_ThreadException), New Object() {sender, e}) 
     Else 
      ShowDebugOutput(e.Exception) 
     End If 

    End Sub 

    Private Sub AppDomain_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs) 

     ShowDebugOutput(DirectCast(e.ExceptionObject, Exception)) 

    End Sub 

    Private Sub MyApplication_UnhandledException(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 

     ShowDebugOutput(e.Exception) 

    End Sub 

End Class 


End Namespace 

Edit:

Я проследил, что может быть основной проблемой.

Программа запускается с USB-накопителя, и если этот USB-накопитель удаляется до завершения программы, по какой-либо причине он попытается добраться до места, откуда было запущено приложение (джойстик USB) и он затем терпит неудачу и падает.

Так что мне кажется, что мне придется самому скопировать программу, а затем запустить из местоположения на компьютере. Странно, однако, что это не всегда проблема. Но на виртуальных машинах, работающих под управлением Windows 8.1, я наблюдаю за этим почти все.

Я предполагаю, что буду играть с ним немного больше, так как я бы предпочел, чтобы я смог удалить USB-накопитель, когда программа запущена и запущена. Запугивает меня, почему он должен иметь доступ к .exe, чтобы быть в состоянии закончить?

+1

«Это сбой» не является подходящим описанием проблемы. Вы должны * написать обработчик событий для события AppDomain.CurrentDomain.UnhandledException, чтобы необработанные исключения стали диагностироваться. Отправьте сообщение об исключении и трассировку стека, которые теперь вам нужно получить здесь. –

+0

Ah ok .. Спасибо. Я рассмотрю это :) Будет ли это также улавливать «Программа перестала отвечать и должна быть закрыта» - диалоговое окно? Или это диалоговое окно является прямым результатом исключения, происходящего вне потока, что означает, что вы не получите обычный диалог «Необработанное исключение»? – Gematria

+0

Да, вы вызываете Environment.Exit() в обработчике событий после отображения или регистрации исключения, чтобы этот диалог WER не отображался. –

ответ

0

Там не должно быть никаких проблем с сделать его глобальным, просто используйте этот код:

Public Shared Sub Main(args As String()) 
    AppDomain.CurrentDomain.UnhandledException += New UnhandledExceptionEventHandler(AddressOf ApplicationUnhandledException) 
End Sub 

Private Sub ApplicationUnhandledException(sender As Object, e As UnhandledExceptionEventArgs) 
     'Write all the information to help diagnose the problem 
End Sub 

Затем предоставить Hans &/или I с информацией.

+0

Его в первоначальном вопросе. То есть выход, который я могу получить от него в любом случае. Код, который у меня есть в appevents.vb, находится в начальном вопросе тоже через мгновение. – Gematria