こんにちは。
現在、A.exe(メインメニュー)からB.exe(個別メニュー)を
Shell関数で起動させていて、B.exe(個別メニュー)内の処理で
何らかエラーが発生した場合に、呼出元であるA.exe(メインメニュー)を
点滅させたいと考えています。
点滅自体は FlashWindowを利用すればできるのかな…と考えているのですが
B.exeからA.exeに値を渡す方法が分かりません…
どなたかご存知の方、教えて頂けませんか?
宜しくお願いします。
DDEを使用するとか
編集 削除------------------------
0.詳しくはヘルプか「VB コマンドライン引数」で調べてください。
1.環境が書いていないので、VB6を仮定しています。
2.最近その辺をさわっていない+今試せる環境に無いので確認はしていません。
------------------------
Call Shell("a.exe" & " " & strValue)
で値が渡せると思います。
strValueは文字列型で、渡したい値を入れる事を想定しています。
また、b.exe側で、
strValue = Command()
のようにして、値を取得します。
失礼しました。
上の私の書き込みは A.exe -> B.exe ですね。
というわけで、少し代案を考えてみました。
(ABCさんのDDE以外で)
1.レジストリを使う
2.ファイルに書き出して渡す
3.クリップボードを使う
ちなみに個人的なお勧めは 2 のファイルに書き出す、です。
私も以前までそういうケースで悩んでました。
というのも、だんだん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の引数で変数を文字列で渡す」のがいいと思います。
Shellで起動時に、引数でA.exeのウィンドウハンドルをB.exeに渡し
B.exeからA.exeにSendMessageでエラーメッセージを送るとか。
ん!待てよ、FlashWindow の第一引数はウィンドウのハンドルだから
渡された引数で、直接A.exeのタスクバーをフラッシュさせられかな。
でもA.exeの方もタスクバーをフラッシュさせられても、そのイベントを
検知する方法が無いか、それともただフラッシュさせればいいのかな。
頭がこんがらがって来た、今日は帰って寝よ。。。。。。。
適当にTCPでループバックに送って、メッセージとして直接受け取ったら?
簡単にできるはずだ…と思う。
A側
Shell "b.exe" & " " & CStr(Me.hWnd)
B側
Dim r
r = FlashWindow(Val(Command), 1)
これだけでいけますね。
こんばんは。
みなさんのご意見、すごぉ〜く参考になりました!!
(こんなに返信がもらえるなんて思ってませんでした・・・)
早速、試してみます!
ちなみに環境はVB6でした。
説明不足で、解り辛い点が多くあったと反省しました。
すみませんでした。