ウィンドウメッセージ – プログラミング – Home

通知
すべてクリア

ウィンドウメッセージ


竹氏
 竹氏
(@竹氏)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

こんにちは。
いつも勉強させてもらっています。

開発環境
WindowsXP、VisualC++6.0、ダイアログベース

アプリケーション同士のメッセージの通信を行いたいです。
文字列の送受信を行います。
送信側と受信側は別のアプリケーションです。
下記のコードは正しく動作します。

////////////////////////////////////////////////////////////
送信クライアント側
cWnd->SendMessage(WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);

受信サーバ側
OnCopyDataに書いてあること

pWnd->GetWindowText(bu1, sizeof(bu1));
sprintf(buf, %s, pCopyDataStruct->lpData);
MessageBox(buf);
////////////////////////////////////////////////////////////

で、下記のコードが動作しません。
送信側
cWnd->PostMessage(WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&cds);

受信側
OnTimerにかいてあります。1000msec位のインターバル
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
if (!GetMessage(&msg, NULL, 0, 0)){
return;
}
TranslateMessage(&msg);
DispatchMessage(&msg);

if (msg.message == WM_COPYDATA){
MessageBox(asfdasfas); //正しく受信できたらここに飛ぶはず?
}
}

どこか悪いところがありますでしょうか?
ご教授ください。


引用解決済
トピックタグ
竹氏
 竹氏
(@竹氏)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

すいません。
追加です。
パイプ、ソケット(Winsock)は使用したくありません。

受信したデータはmsgに入っていると考えてよいのでしょうか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

PostMessage じゃダメで、必ず SendMessage を使わなければならなかったような気がし
ますが、WM_COPYDATA のヘルプには、そんなことは書いてありませんでした。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

同種の制限が載ってたはずだと思って調べましたが、ずばりのものは CE の方のみに
書いてありました。

<MSDN>
An application must use the SendMessage function to send this message,
not the PostMessage function.
</MSDN>

CE 以外でも原則は SendMessage のようですが、多少制限はゆるくなっているらしく、
一定の制限を満たせば Post でもいけるように読めます。

see にも PostMessage はないですし、記述はいずれも send ですがダメとは書いてない

<MSDN>
An application sends the WM_COPYDATA message to pass data to another
application.
-- snip --
To send this message, call the SendMessage function as follows.
</MSDN>

ということで、提示コードでは使っているバッファ領域がこの辺りの条件を
満たしていないのではないでしょうか。
<MSDN>
While this message is being sent, the referenced data must not be changed
by another thread of the sending process.
</MSDN>


返信引用
くまさん
 くまさん
(@くまさん)
ゲスト
結合: 20年前
投稿: 6
 

VC++.net2002のヘルプには、

An application sends the WM_COPYDATA message to pass data to another application.

To send this message, call the SendMessage function with the following
parameters (do not call the PostMessage function).

とありました。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> To send this message, call the SendMessage function with the following
> parameters (do not call the PostMessage function).

手元の MSDN (2001/10) を見たら確かにそう書いてありました。(ご指摘を受けて別の MSDN を確認)

今バージョンが分からない/確認できないのですが、自宅の新しい奴ではその文言が
見当たらなかった気が....。(仕様変更で制限が緩くなっているのでしょうか)

> WindowsXP、VisualC++6.0、ダイアログベース

PlatformSDK のバージョンアップなどにも依存しそうですが、
SendMessage にしておく方が無難かと思います。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

SendMessage ならば、SendMessage を呼んでから戻るまでの間に、受信側でメッセージ
が同期的に処理されることが保障されますから、SendMessage を呼んでいる関数の中で
宣言したローカル変数も、受信側が処理している間は存在しています。
PostMessage だと非同期に処理されるため、受信側がキューからメッセージを取り出し
た時には、既に送信側は関数を抜けて、ローカル変数が解体されている可能性がありま
す。
逆に言えば、PostMessage でも、受信側がメッセージを処理するときに、まだ 
COPYDATASTRUCT::lpData が指しているデータが生きていればいいわけですね。

…たぶんね。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> …たぶんね。

たぶん、ですね。

# .NET2003 の MSDN には、やっぱり Post~ダメって書いてなかったです。仕変かな。


返信引用
竹氏
 竹氏
(@竹氏)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

シャノンさん、Banさん、くまさんさん?
どうもありがとうございます。

ご指摘を受けて無難そうなSendMessageで行くことになりました。
実際に解決はしていないのですが、解決にしてしまってよろしいでしょうか?

アドバイスありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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