こんにちは。
1のexeからボタンを押して1を開いたまま2のexeを起動し、
2のexeのボタンを押したら1に引数を渡したいのですが、
どのように引数を渡したらよいのでしょうか?
1を再び起動させるやり方なら
strExe.Format( 1.exe %s %s 引数a, 引数b );
WinExec( strExe, SW_SHOW);
のようにしてできたのですが、再度起動させるのではなく起動してる1のexeに
渡したいです。
ご教授お願いします。
環境はWinXP Pro、Visual C++2005、MFC ダイアログベースです。
何をどのような用途で渡したいのかを明確に書いたほうがいいかと。
1で編集ボタンを押すと2の編集するexeが起動して、2のテキストボックスに入力された
ものを
1で取得して表示させたいのです。
再度調べたところSendMessageでできそうなかんじですが可能でしょうか?
> SendMessageでできそうなかんじですが可能でしょうか?
1がメッセージを受理できるなら可能です。
1が先に起動していても受理できるのでしょうか?
> 1がメッセージを受理できるなら可能です。
1が CUI でなくて GUI のアプリなら受理できるという意味じゃない。
コンソールアプリで処理用の exe 起動してもメッセージを受け取れないよ。
> 1が先に起動していても受理できるのでしょうか?
できます。
起動中のプログラムは、「クリックされた」とかの情報を、
メッセージとしてOSから受け取っています。
「プログラム2からデータを投げられた」というメッセージを定義し、
処理する仕組みを作ればよいのです。
ちなみに、メッセージを使わないでもデータを渡すことはできます。
「プロセス間通信」について調べてください。
>金魚ちゃんさん
GUIのアプリです。
>たいちうさん
プロセス間通信について調べたのですが、メッセージのほかに
ソケットやパイプがあるようですね。
この場合どれが一番使いやすいのでしょうか?
私にとって簡単なのはメッセージによる方法。
次にソケット、パイプと続きます。
慣れや好みがあると思います。
もちろん、メッセージという概念を十分理解していない場合、
その理解が先だと思いますが、これについては、ソケットもパイプも同じ事ですね。
諸条件が許すならば、プログラム2が特定のフォルダに
テキストファイルとしてデータを保存し、プログラム1はタイマーで変更を監視する
という方法もあります。
概念としては、ファイルとタイマー位ですので、
最も簡単な方法ではないでしょうか。
>たいちうさん
メッセージでやってみました。
1recvでの処理--------------------------------------------------
void CsyosekijohouDlg::OnBnClickedButton1()
{
strExe.Format( %s\\2send.exe %s %s , FilePath , 引数a , 引数b );
WinExec( strExe, SW_SHOW); //2send.exe起動
}
BOOL CsyosekijouhouDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
LPCSTR pStr = (LPCSTR)(pCopyDataStruct->lpData);
CString Data = pStr;
AfxMessageBox(Data); //受け取ったデータを表示
return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
---------------------------------------------------------------
2sendでの処理--------------------------------------------------
void Cmes_sendDlg::OnBnClickedButton1()
{
HWND recv_wind1,recv_wind2;
WPARAM wParam;
LPARAM lParam;
COPYDATASTRUCT cds;
CHAR lpszData[] = This is TEST.;
cds.dwData = 1;
cds.cbData = sizeof(lpszData);
cds.lpData = (LPVOID)lpszData;
recv_wind1 = ::FindWindow(NULL, (LPCTSTR)_T(2send));
recv_wind2 = ::FindWindow(NULL, (LPCTSTR)_T(1recv));
wParam = (WPARAM)recv_wind1; //送信側のウィンドウハンドラ
lParam = (LPARAM)&cds; //送信するデータ
::SendMessage( recv_wind2, WM_COPYDATA, wParam, lParam );
}
---------------------------------------------------------------
メッセージは送られてるのですが、1のBOOLを通っておらず、
受け取りができません。。。
> メッセージは送られてるのですが、1のBOOLを通っておらず、
> 受け取りができません。。。
メッセージが送られていることをどうやって確認しましたか?
recv_wind2には、実際何が入りましたか?
すでに参考にしているのかもしれませんが、同じコードがありまして、
επιστημηさんとBanさんが指摘(確認)している項目があります。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200607/06070029.txt
1と2を別々に起動させて2でButton1を押すと、1にちゃんとメッセージが届くのですが、
1から2を起動させて2のButton1を押すとうまくいきません。
この場合はメッセージは渡せないのでしょうか?
渡せます。
recv_wind2には、実際何が入りましたか?
別々に起動した場合はrecv_wind2には1のウィンドウハンドラが入ってます。
1から2を起動させると2が見れなくて何が入ってるか不明です。
> 1から2を起動させると2が見れなくて何が入ってるか不明です。
見れないとはどういうことですか?