0

我四处寻找杀死VB6应用程序以前实例的正确方法,但无济于事。如果我们的主服务死了,我们需要终止正在运行的应用程序的前一个实例,然后,当服务恢复时,只应该加载新实例。我试图在以下函数中退出此代码:

Private Sub g_cServerInterface_FatalError(Error As enSvrReturns, ErrorString As String)

Dim sMsg As String
Dim result As VbMsgBoxResult

m_bFatalError = True

UnFreeze

If m_cLanguageText Is Nothing Then
    GoTo TheEnd    'Form not yet loaded - not yet logged on
End If

'    m_NumFatalErrors = m_NumFatalErrors + 1
'    If m_NumFatalErrors > 5 Then
'        Functions.DevInfo "Unable to restart Manitou.", g_cLangText_General
'        End
'    End If

If Error <> SVRERR_NOT_CONNECTED Or RunningInDebugger() Then
    sMsg = g_cLangText_General.GetText("A system error has occurred")

    If ErrorString <> "" Then
        sMsg = sMsg & ":" & vbCrLf & vbCrLf & ErrorString & vbCrLf & vbCrLf
    Else
        sMsg = sMsg & ".  "
    End If

    sMsg = sMsg & g_cLangText_General.GetText("Press OK to attempt to restart or Cancel to quit.")

    result = DevAskOkCancel(sMsg, Nothing)
Else
    ' Since we've been disconnected, attempt immediately to reconnect
    result = vbOK
End If

If (result = vbOK) Then
    On Local Error Resume Next
    If InStr(g_CommandLine, "-U") = 0 Then
        g_CommandLine = g_CommandLine & " -U" & g_cUser.id
    End If
    If InStr(g_CommandLine, "-P") = 0 Then
        g_CommandLine = g_CommandLine & " -P" & g_cUser.Password
    End If
    Shell App.Path & "\" & App.EXEName & " " & g_CommandLine & " -X", vbNormalFocus
    DoEvents
End If

TheEnd:
If (Not RunningInDebugger()) Then
    ' Running as compiled executable
    ' Specifies the exit code for the process, and for all threads that
    ' are terminated as a result of this call. Use the GetExitCodeProcess
    ' function to retrieve the process's exit value. Use the GetExitCodeThread
    ' function to retrieve a thread's exit value.

    CoUninitialize
    ExitProcess 0
Else
    ' Running from the IDE
    End
End If

End Sub

请注意,我为此添加了 CoUninitialize 和 ExitProcess 0 API 调用。服务恢复时如何正确终止先前加载的实例?谢谢拉里

4

1 回答 1

1

Private Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) 只要

私有声明函数 PostMessage Lib "user32" _ Alias "PostMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long

私有常量 WM_CLOSE = &H10

Private Sub Form_Load() Dim strCap As String Dim lngHwnd As Long Dim lngRet As Long strCap = Me.Caption Me.Caption = "*" & strCap

lngHwnd = FindWindow(ByVal vbNullString, ByVal strCap)

If lngHwnd <> 0 Then PostMessage lngHwnd, WM_CLOSE, 0&, 0& End If

Me.Caption = strCap

结束子

于 2015-08-28T09:28:46.727 回答