• ベストアンサー

EXE間で同期をとりながらデーターを受け渡しする方法

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

質問者が選んだベストアンサー

  • ベストアンサー
  • tom777
  • ベストアンサー率77% (14/18)
回答No.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

boo4913
質問者

補足

返答ありがとうございます。 同期をとるAPIがちゃんとあるんですね。 早速コードを参考にしてサンプルプログラムを作ってみました。 すごい!ちゃんと同期とってるっ!! これこれっ!これがしたかったんです。 でも、やっぱりデーターの受け渡しはファイルで行うしかないんですかね? 他の回答で「DDEリンク」を使う意見も頂いたんですけど、 「API」を使った方法と「DDEリンク」を使った方法、 どちらの方法でプログラムを作成するか正直迷ってます。 どちらもサンプルプログラムを作成して試してみましたが、 どちらの方がより一般的なプログラムに仕上がると思いますか? 専門家としての意見を聞かせて頂けるとありがたいのですが... お忙しいとは思いますが時間があったら御意見宜しくお願いします。

その他の回答 (3)

  • amania
  • ベストアンサー率22% (2/9)
回答No.3

2つのExeは、標準のExeじゃないとダメなんですか? 1.標準Exe同士  標準のExe間の通信だと、「DDEリンク」で、  送信/受信が行えますよ。  テキストやラベルで、結果を受取ることができます。  (詳しくは、HELPで調べてください。ごめんね) 2.標準ExeからDLLやActiveX.Exeを使用する   検索するプログラムをDLLやActiveX.Exeにすると  メソッドやプロパティーとして結果を受取れます。  Exeを起動マシンに置いて、使用するのであれば  DLLを使用するの良いですよ。 検索している間は、起動元の処理をさせないのであれば、DLLを使用してモーダル表示にすると大丈夫だと思います。標準Exe同士でもできないことはないですが、 いろいろな所に処理中の記述が必要となるでしょう。

boo4913
質問者

お礼

amaniaさん、ありがごうございました。 「DDEリンク」でデーターの受け渡しが出来るんですね。 今まで言葉だけは聞いたことあったんですけど、 どんな場合に使えば良いのかイマイチ分からなくて... 早速「DDEリンク」を使ってサンプルプログラム作ってみました。 取り敢えず良い感じです。 「DLL」や「ActiveX.Exe」は自分がまだ全く理解できてないので、 今回は様子を見たいと思います。 時間があったら今後試してみたいとは思ってます。 多分DLLやActiveX.Exeの方が、 プログラム的にスマートにまとまるとは思うんですけどね(笑) 本当に参考になりました。ありがとうです。 また何か分からないことがあったら宜しくお願いします。

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.2

こんにちは、honiyonです。  トランシーバーで交信する二人をイメージしてみてはいかがでしょう?  AさんからBさんに用件を伝え、Aさんが「どうぞ」と言うまでBさんはずっと「聞く」の状態です。  検索用EXEから、検索結果が返されるか、「動け!」と情報がくるまで、待機していれば良いのではないでしょうか?  例えば、検索用EXEから通信があったら Flag = TRUE とするようにしておいて、   while not Flag do doEvents  としてみるとか。  参考になれば幸いです(.. #VB暫く触ってないもので、命令や構文おかしかったらゴメンナサイ(^^;

boo4913
質問者

お礼

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

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

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が途中で強制終了した場合には、有効な手段だと思われます。

boo4913
質問者

お礼

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

関連するQ&A

  • データの受け渡しについて

    現在、出席票のプログラムを作っていて出てきた質問です。ただし私がJAVA初心者なため、質問もとても初歩的な部分だとは思いますが、どうぞよろしくお願いいたします。 このプログラムは2つのファイルから成り立たせたいと考えています。1つ(以下:DBTest_a)ではJAppletによってパスワードを入力する。もう2つ(以下:DBTest_b)ではDBTest_aで得たパスワードを受け取り、データベースに接続して各処理を行う(この処理内容もパスワードを表示させたウインドーで表示させたい)。というものです。 受け取るには、DBTest_aをメインにして、 str にパスワードを保持して、DBTest_bをDBTest_a内で呼び出して受け渡そうと考えました。 そのためのパスワードを入力して保持するプログラムと、データベースに接続するプログラムを別々に作成して、個別には実行できるようにはなりました。しかし、DBTest_bへのデータの受け渡しがうまく行かないままです。 現在のDBTest_bでは" JOptionPane.showInputDialog "を使って、パスワードを簡単に入力ができるようにしています。このプログラムの目的が、【キーボードからパスワードを入力して、データベースに接続】ならこれでもいいのですが、この先このプログラムを拡張する(「出席」「欠席」ボタンを押して出席率を変化せせるなどのイベントをつける予定です)ときに" JOptionPane.showInputDialog "だと都合が悪いと思い" JOptionPane.showInputDialog "を用いる必要があるなと感じました。上記で説明したデータの受け渡しがうまくいけば、拡張もできるのではないかと考えています。 長々と私の考えを載せてしまいましたが、重要な質問は【2つのプログラム間でのデータの受け渡し方法】です。

    • ベストアンサー
    • Java
  • 違うファイルのデータの受け渡しについて

    マイコンでCを使っています。 例えば a() interrupt b() と言う関数を作ったとします。 今までは同じファイルにa() b()も入れて作っていたため、グローバル変数で宣言すればデータの受け渡しが簡単だったので、そっちを使っていたんですが、 違うファイルに割り込みを作る場合にはどのようにしてデータの受け渡しをすればいいのでしょうか? 割込みなのでb(int data)のような受け渡しも出来ませんよね。 かといってファイルが違うとグローバル宣言したところで、もう一方のファイルでは宣言されていませんと出ました。 今のままですと、a() b()は同じファイルに入れる事しか解決できなさそうなのですが、多分何か方法があると思い質問しました。 よろしくお願いします。

  • データの受け渡し

    A.aspのデータを B.aspに受け渡すのはどうしたら良いのでしょう教えて下さい。 TEXTBOXからのデータの受け渡しではないです。

  • 非同期プログラミングは必ずマルチスレッド?

    非同期プログラミングは必ずマルチスレッドプログラミングになりますか? ここでいう非同期プログラミングとは、 何かのメソッドを実行してその処理(処理Aとする)の結果を待たずに次の処理Bを実行できて、処理Aが終わったらコールバックやデリゲートで、あらかじめ決められたメソッド(finishとする)が呼ばれるといったものです。 処理Aを実行するメソッドを呼ぶ ↓ すぐに処理Bを実行開始(このときバックグラウンドで処理Aが走っている) ↓ 処理Aが終了したのでfinishメソッドが実行される 例えば、Objective-CのNSURLConnectionで非同期通信するときのようなやつです。 こういった非同期プログラミングは、必ずマルチスレッドを使うことになりますか? 普通、別スレッドで処理させるときはスレッド用のライブラリを使うなどして明示的にマルチスレッドプログラミングをしますが、上のように非同期のメソッドを使うと、その裏で自動的に別のスレッドが動くのでしょうか。 それとも、単一スレッドのみで、非同期プログラミングできるでしょうか。 なお、特殊な言語やOSによっては、いくらでも可能性があると思いますので、 メジャーな環境(Windowsや、スマホ) のみに限定してお願いします。言語で言うと、C、C++、Objective-C、Javaあたり。 また、上の「処理A」が終わったとき、メソッド「finish」が呼ばれるとすると、 処理Bの実行中にどのようなタイミングでfinishが呼ばれるのでしょうか。 処理Bはどのような形でfinishに切り替わるのでしょうか。いきなりfinishに処理を奪い取られるのでしょうか

  • 外部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を始めたもので、質問をする上で情報が欠如しているかもしれませんが、ご回答頂けると幸いです。 よろしくお願いします。

  • データの受け渡しのベスト方法は?

    ウインドウーズからマックへデータを受け渡しする場合、どういう方法が、確実でしょうか? 具体的には、エクセルデータを、受け渡ししたいのですが。メールでは問題があるといわれました。CDでもオーケーでしょうか。 確実な方法を教えてくだされば。

  • 非同期で受信するデータを、全てファイルに書き込むには?(VB6.0です)

    お世話になります。 開発環境は、WindowsXP, VB6.0 になります。 A: 今回の開発アプリ B: Aが取り込んでいるDLL として、質問させて頂きます。 Aは、Bが送ってくるデータを非同期で受け取り 加工して、1つのファイルに追加モードで落とし込みます。 非同期でデータを受け取るため、加工途中で 更に新たなデータが届いた場合、どのように同期を取れば宜しいでしょうか。 データの受け取りは非同期、書き込み処理(&加工処理)は同期させたいのです。 データを受け取る周期は約0.5秒、1回につき書き込む量は多いため 悩んでおります。 何かアドバイスを下さる方がいらっしゃいましたら、ご教示下さい。 宜しく御願い致します。

  • VBからACCESSへのデータの受け渡し

    VBで処理した結果のデータを、他の起動中のACCESSのテキストボックスに表示させることはできるのでしょうか? 初心者で間の抜けた質問かもしれませんが、よろしくお願いします。

  • exe まとめる

    複数あるexeファイルをまとめるということはできるのでしょうか? そのようなものを作ってみたいと思っているのですが 例えば A,B,C,Dというexeファイルがあるとします Aというexeを起動させると B,C,Dのどれを起動させるか選ぶ画面が出てB,C,Dのどれかを選ぶと対応したexeが起動するといったものを作りたいと思っています。 Aをダブルクリック→B,C,D選択画面→Bを選択→Bのexeを起動 といった感じです。 ここでいうAというexeを作成してみたいのです。 わかりにくくてすみません。 プログラミングに関してはほとんど初心者どうぜんでjavaを少々やっているだけです。 できるようなら色々試行錯誤してやってみたいと思うのですが、参考になるページなどあるでしょうか? 詳しい方よろしくお願いします。

  • EXE間でデータを受け渡し時のkarnell32エラー

    VB6.0を使って、OSはMe、98でプログラミングをしています。API関数(OpenProcess,GetProcess,CloseHandle)を使って処理をしているのですが、実行していると頻繁に「~.exeによりkarnell32.dllに不正な処理が発生しました。問題が解決しなければコンピュータを再起動してください」というようなメッセージが出てしまいます。リソースが足りない時に出ているようでもあるのですが、原因が良くわかりません。どなたか同じような症状がでて「治したぞ!!」という方がいたらよろしくお願いします。

専門家に質問してみよう