引数の渡し方

[戻る]
murua 2008/07/30(水) 14:15:50
こんにちは。

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 ダイアログベースです。

2008/07/30(水) 15:10:21
何をどのような用途で渡したいのかを明確に書いたほうがいいかと。

murua 2008/07/30(水) 15:29:04
1で編集ボタンを押すと2の編集するexeが起動して、2のテキストボックスに入力された
ものを
1で取得して表示させたいのです。
再度調べたところSendMessageでできそうなかんじですが可能でしょうか?

επιστημη [HomePage] 2008/07/30(水) 16:06:22
> SendMessageでできそうなかんじですが可能でしょうか?
1がメッセージを受理できるなら可能です。

murua 2008/07/30(水) 17:13:35
1が先に起動していても受理できるのでしょうか?

金魚ちゃん 2008/07/30(水) 17:25:08
> 1がメッセージを受理できるなら可能です。
1が CUI でなくて GUI のアプリなら受理できるという意味じゃない。
コンソールアプリで処理用の exe 起動してもメッセージを受け取れないよ。

たいちう 2008/07/30(水) 17:43:41
> 1が先に起動していても受理できるのでしょうか?

できます。
起動中のプログラムは、「クリックされた」とかの情報を、
メッセージとしてOSから受け取っています。
「プログラム2からデータを投げられた」というメッセージを定義し、
処理する仕組みを作ればよいのです。


ちなみに、メッセージを使わないでもデータを渡すことはできます。
「プロセス間通信」について調べてください。

murua 2008/07/31(木) 11:00:54
>金魚ちゃんさん
GUIのアプリです。

>たいちうさん
プロセス間通信について調べたのですが、メッセージのほかに
ソケットやパイプがあるようですね。

この場合どれが一番使いやすいのでしょうか?

たいちう 2008/07/31(木) 11:24:17
私にとって簡単なのはメッセージによる方法。
次にソケット、パイプと続きます。
慣れや好みがあると思います。

もちろん、メッセージという概念を十分理解していない場合、
その理解が先だと思いますが、これについては、ソケットもパイプも同じ事ですね。

諸条件が許すならば、プログラム2が特定のフォルダに
テキストファイルとしてデータを保存し、プログラム1はタイマーで変更を監視する
という方法もあります。

概念としては、ファイルとタイマー位ですので、
最も簡単な方法ではないでしょうか。

murua 2008/07/31(木) 17:03:56
>たいちうさん

メッセージでやってみました。

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を通っておらず、
受け取りができません。。。

たいちう 2008/07/31(木) 17:52:53
> メッセージは送られてるのですが、1のBOOLを通っておらず、
> 受け取りができません。。。

メッセージが送られていることをどうやって確認しましたか?
recv_wind2には、実際何が入りましたか?


すでに参考にしているのかもしれませんが、同じコードがありまして、
επιστημηさんとBanさんが指摘(確認)している項目があります。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200607/06070029.txt

murua 2008/08/01(金) 12:06:23
1と2を別々に起動させて2でButton1を押すと、1にちゃんとメッセージが届くのですが、
1から2を起動させて2のButton1を押すとうまくいきません。
この場合はメッセージは渡せないのでしょうか?

たいちう 2008/08/01(金) 12:42:38
渡せます。
recv_wind2には、実際何が入りましたか?

murua 2008/08/01(金) 13:22:47
別々に起動した場合はrecv_wind2には1のウィンドウハンドラが入ってます。
1から2を起動させると2が見れなくて何が入ってるか不明です。

たいちう 2008/08/01(金) 14:12:49
> 1から2を起動させると2が見れなくて何が入ってるか不明です。
見れないとはどういうことですか?

たいちう 2008/08/01(金) 14:24:06
> 見れないとはどういうことですか?

怒っているみたいな書き方だな。ごめん。

VC++から起動したときしかデバッグできないのでは不便でしょ。
ログファイルに書き出すとか、メッセージボックスで表示するとか、
工夫して状況を確認しないと、何が失敗しているのか分からんでしょ。

murua 2008/08/04(月) 14:29:29
[[解決]]
解決しました。
というのも、1から起動させる2がきちんと更新されていないことが原因でした。。。
かなり初歩的なミスで申し訳ございません。

おかげ様でメッセージを渡すとこには成功しました。
また新たな問題が出てきましたが・・・ここは一度〆ます。
本当にありがとうございました。

古いスレッドには追加発言できません。