获取.net应用和vb6应用程序互相交流?

时间:2011-08-11 14:18:57

标签: c# vb6 messaging systray

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

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

到目前为止,这对我来说非常有效。

答案 1 :(得分: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代码那样工作。

答案 2 :(得分:0)

我没有方便的细节,但我过去曾使用Windows消息发送WM_NULL。它相当于ping消息。因此VB6应用程序会向systray应用程序发送定期ping。如果系统托盘应用程序没有及时响应ping,则VB6应用程序知道它已挂起或未运行。

答案 3 :(得分:-1)

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

答案 4 :(得分:-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