使.net应用程序和vb6应用程序相互通信

本文关键字:应用程序 互通 通信 net vb6 | 更新日期: 2023-09-27 18:05:08

我有几个相互依赖的应用程序。一个是健壮的vb6应用程序。另一个是我期待已久的、采用隐形技术的、可能获得奥斯卡奖的。net(2.0)系统应用程序。vb6应用程序启动systray应用程序。如果vb6应用程序被关闭,systray应用程序将关闭自己,假设它没有其他工作要做(它的工作是将文档保存到数据库)。

我唯一关心的是,如果系统应用程序崩溃或无法做它的工作,由于一些致命的错误会发生什么。这种情况的一个可能的结果是我弹出一个模态对话框告诉用户"立即联系技术支持,因为你不能再保存文档了"。

我认为这里最糟糕的情况是,每当文档在vb6应用程序中处理时(也就是说,用户完成文档并且它的组件被压缩并保存在本地),我只需要检查并看看系统应用程序是否正在运行。我不知道,这看起来有点麻烦。有没有更优雅的方法?是否有某种方式我可以"信号"我的vb6应用程序/有我的vb6应用程序监听这样的信号?

使.net应用程序和vb6应用程序相互通信

我过去所做的是在。net中作为COM对象暴露的类库(在汇编信息中,将ComVisible属性设置为true)。

这样,在VB6中你可以调用从。net类库中导出的方法,在c#中你可以拥有处理这种情况所需的所有代码。

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

您可以使用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代码工作,我想

我没有手边的细节,但我已经使用windows消息发送一个WM_NULL在过去。它相当于一条ping消息。因此,VB6应用程序发送周期性ping到系统杂散应用程序。如果系统杂散应用程序没有及时响应ping,那么VB6应用程序就知道它挂起或未运行。

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

我建议在计时器上使用如下函数:

'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