Windows2000上でVB6.0を使用してプログラミングをしています。
2つのEXE間で同期をとりながらデーターの受け渡しをしたいのですが
どのようにすれば良いのか方法が分かりません。
具体的には、AというEXEからBというデーター検索用のEXEを起動して、
Bの検索結果をAに返したいのですが...
AとBは同期をとっていたいので、
Bが起動している間はAの処理は止めておきたいです。
どなたか良い方法をご存知でないでしょうか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

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

この回答への補足

返答ありがとうございます。

同期をとるAPIがちゃんとあるんですね。
早速コードを参考にしてサンプルプログラムを作ってみました。
すごい!ちゃんと同期とってるっ!!
これこれっ!これがしたかったんです。
でも、やっぱりデーターの受け渡しはファイルで行うしかないんですかね?

他の回答で「DDEリンク」を使う意見も頂いたんですけど、
「API」を使った方法と「DDEリンク」を使った方法、
どちらの方法でプログラムを作成するか正直迷ってます。
どちらもサンプルプログラムを作成して試してみましたが、
どちらの方がより一般的なプログラムに仕上がると思いますか?
専門家としての意見を聞かせて頂けるとありがたいのですが...
お忙しいとは思いますが時間があったら御意見宜しくお願いします。

補足日時:2001/06/07 17:31
    • good
    • 0

2つのExeは、標準のExeじゃないとダメなんですか?



1.標準Exe同士
 標準のExe間の通信だと、「DDEリンク」で、
 送信/受信が行えますよ。
 テキストやラベルで、結果を受取ることができます。
 (詳しくは、HELPで調べてください。ごめんね)

2.標準ExeからDLLやActiveX.Exeを使用する 
 検索するプログラムをDLLやActiveX.Exeにすると
 メソッドやプロパティーとして結果を受取れます。

 Exeを起動マシンに置いて、使用するのであれば
 DLLを使用するの良いですよ。


検索している間は、起動元の処理をさせないのであれば、DLLを使用してモーダル表示にすると大丈夫だと思います。標準Exe同士でもできないことはないですが、
いろいろな所に処理中の記述が必要となるでしょう。
    • good
    • 0
この回答へのお礼

amaniaさん、ありがごうございました。

「DDEリンク」でデーターの受け渡しが出来るんですね。
今まで言葉だけは聞いたことあったんですけど、
どんな場合に使えば良いのかイマイチ分からなくて...
早速「DDEリンク」を使ってサンプルプログラム作ってみました。
取り敢えず良い感じです。

「DLL」や「ActiveX.Exe」は自分がまだ全く理解できてないので、
今回は様子を見たいと思います。
時間があったら今後試してみたいとは思ってます。
多分DLLやActiveX.Exeの方が、
プログラム的にスマートにまとまるとは思うんですけどね(笑)

本当に参考になりました。ありがとうです。
また何か分からないことがあったら宜しくお願いします。

お礼日時:2001/06/07 17:28

こんにちは、honiyonです。


 トランシーバーで交信する二人をイメージしてみてはいかがでしょう?

 AさんからBさんに用件を伝え、Aさんが「どうぞ」と言うまでBさんはずっと「聞く」の状態です。

 検索用EXEから、検索結果が返されるか、「動け!」と情報がくるまで、待機していれば良いのではないでしょうか? 
例えば、検索用EXEから通信があったら Flag = TRUE とするようにしておいて、
  while not Flag do doEvents

 としてみるとか。

 参考になれば幸いです(..
#VB暫く触ってないもので、命令や構文おかしかったらゴメンナサイ(^^;
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
検索用EXEからの通信をどのように受け取ってFlag=TRUEにしたら良いのか、
その辺をもう少し詳しくアドバイス頂けると嬉しかったです。
何かあったらまたアドバイスお願い致します。

お礼日時:2001/06/07 16:57

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が途中で強制終了した場合には、有効な手段だと思われます。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました。
EXE同士で同期をとったりデーターの受け渡しをするのに、
ファイルを経由するなんてやり方があったんですね。
思いつきもしなかったので、とても参考になりました。
他の回答も参考にして作成してみたいと思います。
ありがとうございました。

お礼日時:2001/06/07 16:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NET(ASP.NET)でページAからページBに新しいWindowで飛んだ後ページBにページAのDataGrid情報をもっていく方法

VB.NET(ASP.NET)のWebアプリケーションを
VB.NET2003で開発しているのですが
ページAに表示しているDataGridを新しいWindowで表示したページBのDataGridに表示させたいんです。
Session情報に入れようと思いましたが入らない・・
どうしたらよいでしょうか?

Aベストアンサー

お世話になります。

各画面で全く同じものを表示するのなら、
ユーザコントロールか、Web カスタムコントロールにしてしまうのが効率がよいと思います。
それで、その上で DataSource に使っている
DataSet やら DataTable やらを Session で渡すとか。

> Session情報に入れようと思いましたが入らない・・
これは具体的にどうして入らないのでしょうか。

Q1フォルダに「A.xls」、「B.xls」、「C.xls」・・・とある

1フォルダに「A.xls」、「B.xls」、「C.xls」・・・とある場合、
すべてのファイルに一斉にA1セルに「a」という文字を反映させる場合の
VBAプログラムを教えていただけますでしょうか?
よろしくお願いいたします。

Aベストアンサー

フォルダ名を変更してから試してね
4行目の
mPath = "C:\tmp\"
「aaa」なら
mPath = "C:\aaa\"
に変更


Sub test()
Dim mPath As String
Dim nf As String
mPath = "C:\tmp\"
nf = Dir(mPath & ".xls")
Do While nf <> ""
Workbooks.Open Filename:=mPath & nf
Workbooks(nf).ActiveSheet.Range("a1").Value = "a"
Workbooks(nf).Close SaveChanges:=False
nf = Dir()
Loop
End Sub

簡単なコードにしてあるので、分らない所はヘルプで調べてね
参考まで

QブックAシートAにブックBシートBをコピーしたい

VB.net VB.2008 にてプログラムしています。

ブックAのシートAにブックBのシートBをコピーするには、
どうしたら良いでしょうか?

ブックAシートAには他のシートへの参照が入っています。
ブックBシートBの数値を入れたら、ブックA内の他シートに参照された数値が行き渡るように
したいのですが、行き詰ってます。


 Worksheet.Copy()


だと、Before,Afterの設定になり、そのページズバリにコピーができません。

お知恵をお貸しください。
お願いします。

Aベストアンサー

実際に処理を実行するのは Excel なんだから、Excel VBA の
Copy メソッドのヘルプで確認すればいいじゃない???
Worksheet.Range.Copy(Destination) だよね。Cells で
シートの全セルを対象とした Range を取得するか、使用範囲
のみにするか、そのあたりはお好きなようにどうぞ。

QShellコマンドで別のexeを起動するとフォーカスが別exeにいかない

2本のEXE(AとB)があって、

AからBを呼び出して、Bの終了ボタンを
押すとAに戻るようなプログラムがあります。

Bを最前面にして起動しているのですが、
Bにフォーカスがいってくれません。
(Aに残ったままになっている?)

ちなみにAもBもウィンドウスタイルは、
青いバーが出ている状態(動かせる状態)です。

Bが起動している間、Aはその後ろでまっている
ようなイメージです。

どうやったらフォーカスを渡すことが
できるでしょうか?

<条件>
Bのプログラムは修正することができません。
Aのプログラムは自由に修正できます。

どなたか教えて下さい。

Aベストアンサー

http://www.ops.dti.ne.jp/~allergy/vb/vbvba.html#exec

こちらを参考にしてみて下さい。

Q外部exeに対しての引数受け渡し

お世話になります。
2点ほどVB.netのコーディングに関して質問があります。

環境:VB2008
DB:SQLSEVER

A = アプリケーション1
B = アプリケーション2
複数の引数 = DB検索情報(key,テーブル名)&ヒットしたファイルが格納されているルートディレクトリ

●実装したい機能
Aから外部のB(exe)を呼び出し、Aから受け取った複数の引数を元にDBを検索しファイル名をヒットさせ、そのファイルを開く。

質問(1)
Aから外部のB(exe)を呼び出すときにAで取得した複数の引数をBに渡す方法はどうするのでしょうか?

質問(2)
受け取った引数を元にDBを検索し、ヒットしたファイルを開きたいのですが、その複数の引数を格納する構文はどういったものになるのでしょうか?

ネットで調べはしましたが、いまいちピンとくるものがなく質問した次第です。
最近VBを始めたもので、質問をする上で情報が欠如しているかもしれませんが、ご回答頂けると幸いです。
よろしくお願いします。

Aベストアンサー

> 受け取った引数が("SomeEXE.exe", "hoge.txt fuga.txt piyo.txt")となっていますが、
> この"hoge.txt fuga.txt piyo.txt"をxとyといった変数に別々に格納したいのですが・・・。
> xにhoge.txt fuga.txt
> yにpiyo.txt
> といった感じです。

 Process.Start("SomeEXE.exe", "hoge.txt fuga.txt piyo.txt")
としたとき、Mainメソッドに渡される引数は
 CmdArgs(0) → "hoge.txt"
 CmdArgs(1) → "fuga.txt"
 CmdArgs(2) → "piyo.txt"
になります。(スペース区切り)

 Process.Start("SomeEXE.exe", """hoge.txt fuga.txt"" piyo.txt") //←ひとまとめにしたい引数はダブルクォーテーション(")で囲う
とすると、Mainメソッドに渡される引数は
 CmdArgs(0) → "hoge.txt fuga.txt"
 CmdArgs(1) → "piyo.txt"
になります。

> 受け取った引数が("SomeEXE.exe", "hoge.txt fuga.txt piyo.txt")となっていますが、
> この"hoge.txt fuga.txt piyo.txt"をxとyといった変数に別々に格納したいのですが・・・。
> xにhoge.txt fuga.txt
> yにpiyo.txt
> といった感じです。

 Process.Start("SomeEXE.exe", "hoge.txt fuga.txt piyo.txt")
としたとき、Mainメソッドに渡される引数は
 CmdArgs(0) → "hoge.txt"
 CmdArgs(1) → "fuga.txt"
 CmdArgs(2) → "piyo.txt"
になります。(スペース区切り)

 Process.Start("SomeEXE.exe", """hog...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報