3

互いに依存するアプリケーションがいくつかあります。1 つは堅牢な vb6 アプリケーションです。もう 1 つは、オスカー賞を受賞する可能性が高い .net (2.0) systray アプリケーションを採用した、私が待ち望んでいたステルス テクノロジです。vb6 アプリは systray アプリを起動します。また、VB6 アプリがシャットダウンされた場合、systray アプリは他に行う作業がないと想定してシャットダウンします (その作業はドキュメントをデータベースに保存することです)。

私の唯一の懸念は、systray アプリがクラッシュしたり、何らかの致命的なエラーが原因で機能しなくなったりした場合にどうなるかということです。この状態の結果として、ユーザーに「ドキュメントを保存できなくなったため、すぐにサポートに連絡してください」というモーダル ダイアログが表示されます。

ここでの最悪のシナリオは、vb6 アプリでドキュメントが処理されるたびに (つまり、ユーザーがドキュメントを完成させ、そのコンポーネントが圧縮されてローカルに保存される)、systray がアプリが実行されています。わかりません、それは少し面倒です。よりエレガントなアプローチはありますか?vb6アプリに「シグナルを送る」/vb6アプリにそのようなシグナルをリッスンさせる方法はありますか?

4

5 に答える 5

3

私が過去に行ったことは、COM オブジェクトとして公開された .NET のクラス ライブラリです (アセンブリ情報で、ComVisible 属性を true に設定します)。

この方法で VB6 から、.NET クラス ライブラリからエクスポートしたメソッドを呼び出すことができ、C# では状況を処理するために必要なすべてのコードを使用できます。

このようにして、VB6 でより少ないコードを記述し、より優れた例外処理 (try-catch-finally)、Log4Net などのログ フレームワークを活用できる C# でより多くのコードを記述します...

これまでのところ、これは私にとって非常にうまく機能しています。

于 2011-08-11T14:27:26.717 に答える
0

WMIを使用すると、次のようなコードを使用して、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 を systray アプリに送信します。systray アプリが ping にタイムリーに応答しない場合、VB6 アプリはハングしているか実行されていないことを認識します。

于 2011-08-11T14:34:11.357 に答える
-1

私の最初の推測は、2つの間の相互通信を導入することです。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 に答える