引数の渡し方 – プログラミング – Home

通知
すべてクリア

[解決済] 引数の渡し方

固定ページ 1 / 2

murua
 murua
(@murua)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

こんにちは。

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


引用未解決
トピックタグ
h
 h
(@h)
ゲスト
結合: 16年前
投稿: 4
 

何をどのような用途で渡したいのかを明確に書いたほうがいいかと。


返信引用
murua
 murua
(@murua)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> SendMessageでできそうなかんじですが可能でしょうか?
1がメッセージを受理できるなら可能です。


返信引用
murua
 murua
(@murua)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

1が先に起動していても受理できるのでしょうか?


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

> 1がメッセージを受理できるなら可能です。
1が CUI でなくて GUI のアプリなら受理できるという意味じゃない。
コンソールアプリで処理用の exe 起動してもメッセージを受け取れないよ。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> 1が先に起動していても受理できるのでしょうか?

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

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


返信引用
murua
 murua
(@murua)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

>金魚ちゃんさん
GUIのアプリです。

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

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

私にとって簡単なのはメッセージによる方法。
次にソケット、パイプと続きます。
慣れや好みがあると思います。

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

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

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


返信引用
murua
 murua
(@murua)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

>たいちうさん

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

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> メッセージは送られてるのですが、1のBOOLを通っておらず、
> 受け取りができません。。。

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

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

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


返信引用
murua
 murua
(@murua)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

1と2を別々に起動させて2でButton1を押すと、1にちゃんとメッセージが届くのですが、
1から2を起動させて2のButton1を押すとうまくいきません。
この場合はメッセージは渡せないのでしょうか?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

渡せます。
recv_wind2には、実際何が入りましたか?


返信引用
murua
 murua
(@murua)
ゲスト
結合: 16年前
投稿: 8
Topic starter  

別々に起動した場合はrecv_wind2には1のウィンドウハンドラが入ってます。
1から2を起動させると2が見れなくて何が入ってるか不明です。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> 1から2を起動させると2が見れなくて何が入ってるか不明です。
見れないとはどういうことですか?


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました