В редких случаях моя программа вылетает после завершения установки обновлений. Это просто дает мне: «Ошибка 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, чтобы быть в состоянии закончить?
«Это сбой» не является подходящим описанием проблемы. Вы должны * написать обработчик событий для события AppDomain.CurrentDomain.UnhandledException, чтобы необработанные исключения стали диагностироваться. Отправьте сообщение об исключении и трассировку стека, которые теперь вам нужно получить здесь. –
Ah ok .. Спасибо. Я рассмотрю это :) Будет ли это также улавливать «Программа перестала отвечать и должна быть закрыта» - диалоговое окно? Или это диалоговое окно является прямым результатом исключения, происходящего вне потока, что означает, что вы не получите обычный диалог «Необработанное исключение»? – Gematria
Да, вы вызываете Environment.Exit() в обработчике событий после отображения или регистрации исключения, чтобы этот диалог WER не отображался. –