プログラムを2つ同時に実行して、データを渡しあうには?

解決


かんとく  2008-04-22 13:15:26  No: 100604  IP: 192.*.*.*

お世話になっております。

WindowsXP,VB6  です。

ソフトを2つ作ります。
AAA.exe
BBB.exe

それぞれ同時に起動させて、
AAA.exe  から、BBB.exe  へデータを渡す方法はどうしたらよいのでしょうか?

ファイルを介すれば簡単だとは思いますが、ファイルを介さずに直接やり取りしたいです。
また、起動時のコマンドライン引数という方法でもなく、起動中何度もやり取りしたいです。

よろしくお願いします。

編集 削除
YK  2008-04-22 14:32:16  No: 100605  IP: 192.*.*.*

こんにちは。
興味本位ですみませんが
何の為にそんなややこしいことをするのでしょうかね。
どんなデータをやりとりするのですか?

編集 削除
かんとく  2008-04-22 15:10:30  No: 100606  IP: 192.*.*.*

実際に行いたいことは、WEBサーバとの通信です。

AAA.exeが一人でサーバにデータを取りにいくと、通信中AAA.exeの動きが止まってしまいます。
そこで、通信したいときは、AAA.exeからBBB.exeに通信指示を出し、BBB.exeがサーバと通信を行い、BBB.exeがサーバからのデータ受信を完了したら、そのデータをAAA.exeに渡して欲しいのです。
そうすれば、AAA.exeは通信中に動きが中断されなくていいかな、と思いました。

けっこう頻繁にWEBサーバと通信します。通信中に動きが中断されないのが目的なので、この目的が達成できれば、他の方法でもいいのですが。

ちなみに、通信は、Microsoft.XMLHTTP を利用します。

よろしくお願いします。

編集 削除
熊谷隆史  2008-04-22 15:45:22  No: 100607  IP: 192.*.*.*

> ちなみに、通信は、Microsoft.XMLHTTP を利用します。

非同期モードにすれば済む話なのかな。
http://msdn2.microsoft.com/en-us/library/ms757849(VS.85).aspx


> ファイルを介すれば簡単だとは思いますが、ファイルを介さずに直接やり取りしたいです。
> また、起動時のコマンドライン引数という方法でもなく、起動中何度もやり取りしたいです。

WM_COPYDATAとか。

編集 削除
K.J.K.  2008-04-22 18:17:16  No: 100608  IP: 192.*.*.*

熊谷さんの書いているように、まずは非同期モードで試してみてください。

で、VB6でプロセス間通信ならば、DDEを使うかActiveX EXE化(BBB.exe)するか
が簡単では。

編集 削除
熊谷隆史  2008-04-23 10:55:26  No: 100609  IP: 192.*.*.*

K.J.K.さん
> で、VB6でプロセス間通信ならば、DDEを使うかActiveX EXE化(BBB.exe)するか
> が簡単では。
なるほど、勉強になります。

編集 削除
かんとく  2008-04-23 12:30:47  No: 100610  IP: 192.*.*.*

ありがとうございます。

非同期にするだけでは解決しませんでした。

めんどくさいと思われると思いますが、やりたいことをもっと詳しく書くと、AAA.exeからBBB.exeに通信の要求を出して、BBB.exeがサーバと通信してからAAA.exeへデータを渡すまでの間、AAA.exeでは、例えば通信中という表示をしたり、プログレスバーで進行を表示したり、キャンセルを受け付けたりしたいのです。
だから、単純に非同期にしても、AAA.exeは通信中表示処理しかしないので、結局、BBB.exeからデータが渡されない限り、AAA.exeは次のルーチンに進めないのです。

ActiveX EXEを作る方法を試してみようと思いますが、初めてなので、まだうまくいってません。
進んだら、報告(解決チェック)します。

ありがとうございました。

編集 削除
魔界の仮面弁士  2008-04-23 13:31:45  No: 100611  IP: 192.*.*.*

> 通信は、Microsoft.XMLHTTP を利用します。
非同期モードを使うのであれば、Microsoft.XMLHTTP や
MSXML2.XMLHTTP よりも、ServerXMLHTTP の方が良いかと。

setTimeout メソッドや waitForResponse メソッドは、
サーバ版の方にしか用意されていませんし。


> 非同期にする だけ では解決しませんでした。
非同期だけですべてを解決するには至らなかったものの、
部分的には解決できた部分もあった、という事でしょうか。


> AAA.exeは通信中表示処理しかしないので、結局、BBB.exeから
> データが渡されない限り、AAA.exeは次のルーチンに進めないのです。
あれ。非同期モードを使うなら、そもそもプロセスを分ける必要が無いのでは?


> プログレスバーで進行を表示したり、
進捗状況の表示にプログレスバーを使うという事は、あらかじめ、
処理の総時間数またはステップ数が分かっている必要がありますが、
その点は大丈夫でしょうか。


> キャンセルを受け付けたりしたいのです。
非同期モードなら、まずは abort メソッドとか。

編集 削除
かんとく  2008-04-23 15:10:02  No: 100612  IP: 192.*.*.*

いつも詳しいご説明、ありがとうございます。

上司から言われたことと同じことを指摘されて耳が痛かったです。
プログレスバーの値は、60をMAXとして、1秒ごとに1ずつ増加させていました。60秒でサーバからデータが帰ってこなければ、タイムアウトとするように処理していました。
まんまり見栄えはよくないと思います。

非同期にして解決できることとしては、通信中に画面が固まったようにならないということがあると思います。

ServerXMLHTTPについて、もう少しよく調べてみます。

ありがとうございました。

編集 削除
かんとく  2008-05-09 12:24:48  No: 100613  IP: 192.*.*.*

返事が遅くなりました。

結局、ソフトを分けずに、非同期モードで対応します。

ServerXMLHTTPはサーバ向け、というような言われ方がよくされているようですけど、クライアント側で使っても特に問題はないですよね?

ありがとうございました。

編集 削除
魔界の仮面弁士  2008-05-09 15:42:08  No: 100614  IP: 192.*.*.*

> ServerXMLHTTPはサーバ向け、というような言われ方がよくされているようですけど、クライアント側で使っても特に問題はないですよね?

大きな違いは、ユーザーとの対話性にあります。

たとえば SSL 証明書に問題があった場合、XMLHTTP であれば
既定のセキュリティ警告画面を自動的に表示してくれます。
(クライアント上であれば、ユーザとの対話が可能ですね)

しかし ServerXMLHTTP は、サーバ側で動作する事を前提に
設計されているため、そのような確認画面は表示されません。
(ユーザは、サーバ上の画面を見ることも操作することもできないのですから)

そのかわり ServerXMLHTTP では、ユーザ応答無しで処理を完了できるよう、
オプション指定(SXH_SERVER_CERT_OPTION)を用いて、そのような証明書エラーを、
無視する事もエラーとする事もできるように設計されています。

編集 削除