- ベストアンサー
EXE間で同期をとりながらデーターを受け渡しする方法
Windows2000上でVB6.0を使用してプログラミングをしています。 2つのEXE間で同期をとりながらデーターの受け渡しをしたいのですが どのようにすれば良いのか方法が分かりません。 具体的には、AというEXEからBというデーター検索用のEXEを起動して、 Bの検索結果をAに返したいのですが... AとBは同期をとっていたいので、 Bが起動している間はAの処理は止めておきたいです。 どなたか良い方法をご存知でないでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
データの受け渡しはファイルで行うとして、同期をとるのは OpenProcess、WaitForSingleObject、CloseHandle等の APIを使用すれば可能です。 以下参考にして下さい。 **************************************************** Private Declare Function OpenProcess Lib "kernel32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" _ (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Private Const SYNCHRONIZE = &H100000 Private Const INFINITE = &HFFFF Private Sub Command1_Click() Dim IDProcess As Long Dim hProcess As Long Dim ret As Long IDProcess = Shell("calc.exe", vbNormalFocus) hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess) ret = WaitForSingleObject(hProcess, INFINITE) ret = CloseHandle(hProcess) MsgBox " 終了しました ", vbInformation End Sub
その他の回答 (3)
- amania
- ベストアンサー率22% (2/9)
2つのExeは、標準のExeじゃないとダメなんですか? 1.標準Exe同士 標準のExe間の通信だと、「DDEリンク」で、 送信/受信が行えますよ。 テキストやラベルで、結果を受取ることができます。 (詳しくは、HELPで調べてください。ごめんね) 2.標準ExeからDLLやActiveX.Exeを使用する 検索するプログラムをDLLやActiveX.Exeにすると メソッドやプロパティーとして結果を受取れます。 Exeを起動マシンに置いて、使用するのであれば DLLを使用するの良いですよ。 検索している間は、起動元の処理をさせないのであれば、DLLを使用してモーダル表示にすると大丈夫だと思います。標準Exe同士でもできないことはないですが、 いろいろな所に処理中の記述が必要となるでしょう。
お礼
amaniaさん、ありがごうございました。 「DDEリンク」でデーターの受け渡しが出来るんですね。 今まで言葉だけは聞いたことあったんですけど、 どんな場合に使えば良いのかイマイチ分からなくて... 早速「DDEリンク」を使ってサンプルプログラム作ってみました。 取り敢えず良い感じです。 「DLL」や「ActiveX.Exe」は自分がまだ全く理解できてないので、 今回は様子を見たいと思います。 時間があったら今後試してみたいとは思ってます。 多分DLLやActiveX.Exeの方が、 プログラム的にスマートにまとまるとは思うんですけどね(笑) 本当に参考になりました。ありがとうです。 また何か分からないことがあったら宜しくお願いします。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 トランシーバーで交信する二人をイメージしてみてはいかがでしょう? AさんからBさんに用件を伝え、Aさんが「どうぞ」と言うまでBさんはずっと「聞く」の状態です。 検索用EXEから、検索結果が返されるか、「動け!」と情報がくるまで、待機していれば良いのではないでしょうか? 例えば、検索用EXEから通信があったら Flag = TRUE とするようにしておいて、 while not Flag do doEvents としてみるとか。 参考になれば幸いです(.. #VB暫く触ってないもので、命令や構文おかしかったらゴメンナサイ(^^;
お礼
アドバイスありがとうございました。 検索用EXEからの通信をどのように受け取ってFlag=TRUEにしたら良いのか、 その辺をもう少し詳しくアドバイス頂けると嬉しかったです。 何かあったらまたアドバイスお願い致します。
- mnabe
- ベストアンサー率33% (427/1283)
1番簡単なやり方は、テンポラリファイルを使用するのが簡単でしょう。 例えば... 1.A.EXEから、B.EXEを起動する時の引数で、A.EXEが生成したファイルを渡してあげます(拡張子を適当な物にして) 2.B.EXEが動作している最中は、このファイルをそのままにしておきます。それにより、A.EXEは、引数で渡したファイルが存在している最中は、B.EXEが起動しているので、処理を停止しています(タイマかなんかで調べる)。 3.B.EXEが動作終了したら、引数で渡されたファイルで拡張子を変えた物を作成して、その中に結果を入れる 4.B.EXEは結果を書込んだら、引数で渡されたファイルを削除する 5.A.EXEは、ファイルがなくなった事で、B.EXEが終了した事を認識するので、同ファイルの拡張子が違う物を読込んで結果処理を行う。 ってので実現出来ると思います。2番の所で、プロセスハンドルを調べるをつけ足すと、もっと処理が正確になりますね。特にB.EXEが途中で強制終了した場合には、有効な手段だと思われます。
お礼
アドバイスありがとうございました。 EXE同士で同期をとったりデーターの受け渡しをするのに、 ファイルを経由するなんてやり方があったんですね。 思いつきもしなかったので、とても参考になりました。 他の回答も参考にして作成してみたいと思います。 ありがとうございました。
補足
返答ありがとうございます。 同期をとるAPIがちゃんとあるんですね。 早速コードを参考にしてサンプルプログラムを作ってみました。 すごい!ちゃんと同期とってるっ!! これこれっ!これがしたかったんです。 でも、やっぱりデーターの受け渡しはファイルで行うしかないんですかね? 他の回答で「DDEリンク」を使う意見も頂いたんですけど、 「API」を使った方法と「DDEリンク」を使った方法、 どちらの方法でプログラムを作成するか正直迷ってます。 どちらもサンプルプログラムを作成して試してみましたが、 どちらの方がより一般的なプログラムに仕上がると思いますか? 専門家としての意見を聞かせて頂けるとありがたいのですが... お忙しいとは思いますが時間があったら御意見宜しくお願いします。