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) As Long

Private Declare Function PostMessage Lib "user32" _ Alias "PostMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long

Private Const 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 に答える