呼出先Exeから呼出元Exeに値を渡す方法


ももか  2004-11-27 15:58:19  No: 86939  IP: [192.*.*.*]

こんにちは。

現在、A.exe(メインメニュー)からB.exe(個別メニュー)を
Shell関数で起動させていて、B.exe(個別メニュー)内の処理で
何らかエラーが発生した場合に、呼出元であるA.exe(メインメニュー)を
点滅させたいと考えています。
点滅自体は FlashWindowを利用すればできるのかな…と考えているのですが
B.exeからA.exeに値を渡す方法が分かりません…

どなたかご存知の方、教えて頂けませんか?
宜しくお願いします。

編集 削除
ABC  2004-11-27 17:05:22  No: 86940  IP: [192.*.*.*]

DDEを使用するとか

編集 削除
K.  2004-11-27 17:08:22  No: 86941  IP: [192.*.*.*]

------------------------
0.詳しくはヘルプか「VB  コマンドライン引数」で調べてください。
1.環境が書いていないので、VB6を仮定しています。
2.最近その辺をさわっていない+今試せる環境に無いので確認はしていません。
------------------------

  Call Shell("a.exe" & " " & strValue)

で値が渡せると思います。
strValueは文字列型で、渡したい値を入れる事を想定しています。

また、b.exe側で、

  strValue = Command()

のようにして、値を取得します。

編集 削除
K.  2004-11-27 17:09:20  No: 86942  IP: [192.*.*.*]

失礼しました。
上の私の書き込みは A.exe -> B.exe ですね。

編集 削除
K.  2004-11-27 17:12:43  No: 86943  IP: [192.*.*.*]

というわけで、少し代案を考えてみました。
(ABCさんのDDE以外で)

1.レジストリを使う
2.ファイルに書き出して渡す
3.クリップボードを使う

ちなみに個人的なお勧めは 2 のファイルに書き出す、です。

編集 削除
たくみ  2004-11-27 22:25:07  No: 86944  IP: [192.*.*.*]

私も以前までそういうケースで悩んでました。
というのも、だんだんEXEとEXEだけでは限界を感じてきてしまう、
という場合があったからです。

例えば
>1.レジストリを使う
>2.ファイルに書き出して渡す
>3.クリップボードを使う
確かにみんな私もよくお世話になった手法です。

よく読むと
>何らかエラーが発生した場合に、呼出元であるA.exe(メインメニュー)を
と書かれてるので
ももかさんもおそらく、
B.EXEからいわゆる引数を渡すことだけでは要求仕様を満たさないんじゃ?
その監視をずっとA.EXEでしておくのかな?などと考えました。

つまりB側で起こった「イベント」を即、A側で取得したくなるんじゃ?と。
説明がないのでわからないですが、おそらくこのAとBのEXEって
標準EXEですよね?
もしこの話題、はずしていないのだったら
とりあえずActiveX EXE化ないしActiveX DLL化をこの際思いきって
考えられたらどうでしょう。

でも「クラス」が避けて通れないし正直なかなか敷居が高い?ですよね。
私もその辺あんまりえらそうなこといえませんが。
とりあえず、こことかのサンプルと解説ははじめてでも
なじめましたよ。
ここのサンプルをめんどくさがらずに一度RUNさせてみたら
すぐ意味がわかると思います。

http://www.gj.il24.net/~nakasima/vb/tech/GlobalSingleton/

とりあえず他にもいろいろ検索してみられるなら
キーワードは
RaiseEvent
WithEvents
あたりです。
「クラス」だーとか「ActiveX」だーとかあんまり構えずに
その2つのキーワードさえツボとして押さえていけば
なんか道が開けてくると思います。

PS.
そうじゃなく、
B.EXEからのイベントとかぜんぜん無関係でかつ短時間で
結果を出さないといけないのであればK. さんも言われている
「Shellの引数で変数を文字列で渡す」のがいいと思います。

編集 削除
ねろ  2004-11-27 23:01:44  No: 86945  IP: [192.*.*.*]

Shellで起動時に、引数でA.exeのウィンドウハンドルをB.exeに渡し
B.exeからA.exeにSendMessageでエラーメッセージを送るとか。
ん!待てよ、FlashWindow の第一引数はウィンドウのハンドルだから
渡された引数で、直接A.exeのタスクバーをフラッシュさせられかな。
でもA.exeの方もタスクバーをフラッシュさせられても、そのイベントを
検知する方法が無いか、それともただフラッシュさせればいいのかな。
頭がこんがらがって来た、今日は帰って寝よ。。。。。。。

編集 削除
ガッ  2004-11-28 10:27:51  No: 86946  IP: [192.*.*.*]

適当にTCPでループバックに送って、メッセージとして直接受け取ったら?
簡単にできるはずだ…と思う。

編集 削除
ねろ  2004-11-28 12:19:38  No: 86947  IP: [192.*.*.*]

A側
Shell "b.exe" & " " & CStr(Me.hWnd)

B側
Dim r
r = FlashWindow(Val(Command), 1)
これだけでいけますね。

編集 削除
ももか  2004-11-28 18:34:05  No: 86948  IP: [192.*.*.*]

こんばんは。

みなさんのご意見、すごぉ〜く参考になりました!!
(こんなに返信がもらえるなんて思ってませんでした・・・)

早速、試してみます!

ちなみに環境はVB6でした。
説明不足で、解り辛い点が多くあったと反省しました。
すみませんでした。

編集 削除