3

我有几个相互依赖的应用程序。一个是强大的 vb6 应用程序。另一个是我热切期待的、采用隐形技术的、可能赢得奥斯卡奖的 .net (2.0) 系统托盘应用程序。vb6 应用程序启动系统托盘应用程序。如果 VB6 应用程序关闭,系统托盘应用程序将自行关闭,假设它没有其他工作要做(它的工作是将文档保存到数据库)。

我唯一剩下的担心是如果系统托盘应用程序由于某些致命错误而崩溃或无法正常工作会发生什么。这种情况的一个可能结果是我弹出一个模式对话框,告诉用户“立即联系支持,因为你不能再保存文档了”。

我认为这里最糟糕的情况是,每当在 vb6 应用程序中处理文档时(即,用户完成文档并且它的组件被压缩并保存在本地),我只需要检查并查看系统托盘应用程序正在运行。不知道,好像有点麻烦 有没有更优雅的方法?有什么方法可以“发信号”我的 vb6 应用程序/让我的 vb6 应用程序监听这样的信号吗?

4

5 回答 5

3

我过去所做的是将.NET 中的类库公开为 COM 对象(在程序集信息中,将 ComVisible 属性设置为 true)。

通过这种方式,您可以从 VB6 调用从 .NET 类库中导出的方法,而在 C# 中,您可以获得处理这种情况所需的所有代码。

通过这种方式,我在 VB6 中编写的代码更少,而在 C# 中编写的代码更多,我们可以从中受益于更好的异常处理(try-catch-finally)、Log4Net 等日志框架……

到目前为止,这对我来说效果很好。

于 2011-08-11T14:27:26.717 回答
0

您可以使用 WMI 通过使用类似于以下的代码来检查它是否很容易运行:

dim foundIt
For Each Process in GetObject( "winmgmts://." ).InstancesOf( "win32_process" )
    If UCase( Process.name ) = "MYDOTNET.EXE" Then
        foundIt = true 
    End If
Next
if not foundIt then
    msgbox( "It's not running, so start the process")
end if

请注意,将上面的内容写为 VBscript,但应该像我认为的 VB6 代码一样工作。

于 2011-08-11T14:31:24.743 回答
0

我手头没有详细信息,但我过去曾使用 Windows 消息传递来发送 WM_NULL。它相当于一个 ping 消息。因此 VB6 应用程序会定期向系统托盘应用程序发送 ping。如果系统托盘应用程序未及时响应 ping,则 VB6 应用程序知道它已挂起或未运行。

于 2011-08-11T14:34:11.357 回答
-1

我的第一个猜测是在两者之间引入互通。让 VB6 应用程序以定义的时间间隔发送 PING 请求。然后,如果 VB6 应用程序没有收到响应或请求超时,请执行您需要执行的操作。

于 2011-08-11T14:28:39.863 回答
-1

我建议在计时器上使用类似以下功能的东西:

'declaration for FindWindow API
Private Declare Function FindWindow _
        Lib "user32" _
        Alias "FindWindowA" _
       (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long



'Call the following on a timer with the Tray icon form caption
'when it goes False unleash hell
Private Function IsWindowLoaded(ByVal strWindowCaption As String) As Boolean
    Dim lHwnd As Long
    lHwnd = FindWindow(strWindowCaption, vbNullString)
    If lHwnd <> 0 Then
        IsWindowLoaded = True
    Else
        IsWindowLoaded = False
    End If
End Function
于 2011-08-12T12:33:22.150 回答