2011-08-11 12 views
3

私は、お互いに依存する2つのアプリケーションを持っています。 1つは堅牢なvb6アプリケーションです。もう一つは私の熱心に期待されているステルス技術を採用しており、おそらくオスカーの.net(2.0)システムトレイアプリケーションです。 vb6アプリはシステムトレイアプリを起動します。そしてVB6アプリケーションがシャットダウンされた場合、他の作業がないと仮定すると、シストレイアプリケーションは自動的にシャットダウンします(文書をデータベースに保存する作業です)。.netアプリとvb6アプリをお互いに話をするには?

唯一残っているのは、システムトレイアプリがクラッシュしたり、致命的なエラーが発生して作業を実行できない場合です。この状態の可能性の高い結果は、モーダルダイアログをポップアップして、ユーザーに「ドキュメントをもう保存できないため、サポートにすぐ連絡する」ことを伝えます。

ここで最悪のシナリオは、ドキュメントがvb6アプリで処理されるたびに(すなわち、ユーザーがドキュメントを完成し、コンポーネントが圧縮されてローカルに保存されると)、チェックしてシステムトレイアプリが動作しているかどうかを確認してください。私は知らない、少し面倒なようです。より洗練されたアプローチはありますか?私のvb6アプリを「信号」することができる/私のvb6アプリにそのような信号を聞くことができる何らかの方法はありますか?

+1

.NETで行わ何でもステルスは何ですか?余分な(そして膨大な)ランタイムが必要で、逆コンパイルは簡単です。 – Bob77

+0

あなたの皮肉メーターを確認してください – Erix

+0

いいえ、皮肉、正直な好奇心。私はここで「ステルス」がどこに来るのだろうと思っていた。 – Bob77

答えて

3

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

VB6からこの方法で、.NETクラスライブラリとC#からエクスポートしたメソッドを呼び出すことができます。このコードでは、状況を処理するために必要なすべてのコードを持つことができます。私たちはより良い例外ようにlog4netのとのようなフレームワークをログに記録する、(のtry-catch-最終的に)扱うの利益を得ることができるC#でVB6とよりが少ないコードを書く。このように

...

これが働いています今のところ私のために非常に良い。

+0

「Ping」というメソッドも追加できます! (ちょうどこの質問への他のすべての答えを廃止するように) – wqw

-1

私の最初の推測では、両者の相互通信が導入されるでしょう。 VB6アプリケーションに定義された間隔でPING要求を送信させます。その後、VB6アプリケーションが応答を受信しないか、要求がタイムアウトする場合は、必要な処理を行います。

+0

PING同じマシン上の別のアプリへのリクエスト? –

+0

どうしてですか?私はPINGをコマンドシェルとして利用していると思いますか?私はただ生きていることを話しているだけです。これは、特に相互に依存しているアプリケーション間で、常に行われています。アプリケーションが同じマシン上にあるからといって、互いに通信できないというわけではありません。それは、もう一方が作成したファイルを監視するものと同じです。私は、この方法を使ったいくつかの大規模エンジニアリング会社で働いてきました。実行中の実行可能ファイルのウィンドウを見つけたりプロセスを監視したりするよりもパフォーマンスが向上します。また、アプリを別々のマシンで実行する必要がある場合は、柔軟性があります。 – Josh

+0

はいほとんどの人にpingするのは、シェルコマンドPINGを意味します。私はあなたの答えを編集することをお勧めしますか? –

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 

は注意してください、VBスクリプト、上記のように書きましたが、私は思っているだろうVB6のコードとして動作するはずです。

+1

アプリケーションでWMIを使用しないでください。これは、特定のWindowsインストールで無効になるか、または存在しない管理ツールです。 – Bob77

+0

@bob:アプリケーションとその対象者によって異なります。私は家庭の消費者向けのアプリでWMIを使用することは避けたいと思いますが、自分の会社などで社内で使用するためのアプリだと思っていましたが、そうではないかもしれませんが、 WMIが利用可能で問題がない場合。 –

0

私は細かいことはありませんが、過去にWM_NULLを送信するためにメッセージングを使用しました。それはpingメッセージに相当します。したがって、VB6アプリケーションは、システムトレイアプリケーションに定期的なpingを送信します。 systrayアプリが適時にpingに応答しない場合、VB6アプリはそれがハングしているか、動作していないことを知っています。

-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 
+0

あなたは私が以下で提案したのと同じことをしていますが、もっとオーバーヘッドがあります。上記のKevin Galeの記事を読むと、彼は同じことを言います。あなたは現実のシナリオを使って彼に投票しようとしていますか? – Josh

+0

@Josh - ケヴィン・ガレスは、Windowsのメッセージングについて回答しています。あなたの答えを編集して、あなたが意味することをより明確にできると思います。 Kevin Galeが同じことを言ったように、あなたはおそらくそれを今でも削除することができます。 –

関連する問題