C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: postmessageでnewしたデータを送る。


(過去ログ 59 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■33909 / inTopicNo.1)  postmessageでnewしたデータを送る。
  
□投稿者/ 相場 (1回)-(2009/03/13(Fri) 00:54:54)

分類:[C/C++] 

2009/03/13(Fri) 00:56:33 編集(投稿者)

お世話になっています。
いきなりですが質問があります。

C++でPostMessageでnewした構造体データを送りたいのですが、
どのように送る、受信すればいいのか(参考書やサイトを見たのですが)理解ができません。
ご教授お願いします。

■やりたいこと(下記のとおりではエラーが多発してしまいます^^;)
//構造体
struct As{
private int a1;
private int a2;
public int getA1(){
return a1;
}
〜〜〜〜〜セッターとか色々
}

//ポスト側
As* st = new As();//構造体をnew
PostMessage(hwnd,USER+1,st,NULL);←//造体をポストする

//受け取り側
GetMessage(~,~,wParam,~);

As st = &wParam;
int bb = st->getA1();

※GetMessageのwParamにはアドレスが送れてくるので、そのアドレスを使ってデータを取り出す?
うーん理解が・・・orz

以上です。



引用返信 編集キー/
■33913 / inTopicNo.2)  Re[1]: postmessageでnewしたデータを送る。
□投稿者/ επιστημη (1825回)-(2009/03/13(Fri) 06:10:59)
επιστημη さんの Web サイト
> ■やりたいこと(下記のとおりではエラーが多発してしまいます^^;)
どこで・どんなエラーですか? コンパイルエラーじゃありませんよね?

...そもそも異なるプロセス間ではポインタ値に意味がなさそうな気が...
共有メモリを用意しておいて、"書いたから読め!"ってことだけをコッチからアッチに
PostMessageすることになんじゃないかと。

あるいはPostMessage改めSendMessage使っていいなら
WM_COPYDATAをSendMessageするのが一番楽だけど。

引用返信 編集キー/
■33915 / inTopicNo.3)  Re[1]: postmessageでnewしたデータを送る。
□投稿者/ 渋木宏明(ひどり) (1097回)-(2009/03/13(Fri) 08:50:21)
渋木宏明(ひどり) さんの Web サイト
> C++でPostMessageでnewした構造体データを送りたいのですが、

できないです。

モダンなOSではプロセスごとにメモリ空間が分離されているので、あるプロセス内で確保したメモリ領域のアドレス値は、別のプロセスでは無意味になります。

引用返信 編集キー/
■33918 / inTopicNo.4)  Re[2]: postmessageでnewしたデータを送る。
□投稿者/ 774RR (324回)-(2009/03/13(Fri) 09:16:16)
最初の発言にはプロセスを超えて送るって書いてないんだけど同一プロセス内部であれば別に問題ない
そもそもプロセスを超えるのであればコンパイラも違う可能性があるし
WM_COPYDATA でコピーしてもコンパイラやコンパイルオプションの違いは吸収できない

同一プロセス内で受け取る前提として
WPARAM に st を送ったのであれば受け取り側では単に
As* st=reinterpret_cast<As*>(wparam);
とするだけ

new した以上いつか delete しなきゃならんのだが PostMessage ではタイミング計るのが難しいね

x64 対応を今のうちにきっちりやっておかないと後で泣きを見る希ガス

引用返信 編集キー/
■33920 / inTopicNo.5)  Re[3]: postmessageでnewしたデータを送る。
□投稿者/ 渋木宏明(ひどり) (1099回)-(2009/03/13(Fri) 09:51:55)
渋木宏明(ひどり) さんの Web サイト
> 最初の発言にはプロセスを超えて送るって書いてないんだけど同一プロセス内部であれば別に問題ない

おー、なるほど、書いてないですね>プロセス超え

> new した以上いつか delete しなきゃならんのだが PostMessage ではタイミング計るのが難しいね

どして? GetMessage() した側が破棄すれば問題ないのでは?

あー、でも GetMessage() するのが、PostMessage() したのと別モジュールだったりすると、別ヒープになってる可能性もあるか。

引用返信 編集キー/
■33922 / inTopicNo.6)  Re[1]: postmessageでnewしたデータを送る。
□投稿者/ とっちゃん (384回)-(2009/03/13(Fri) 11:14:46)
とっちゃん さんの Web サイト
No33909 (相場 さん) に返信

んー。。。HWND は NULLではないんですよね?
同一プロセス内のウィンドウに PostMessage してるんですよね?

まぁ、エラー満載ソース(USER+1からしてエラーですし)なので、よくわからんのですが...

それと GetMessage() でトラップではなくて、プロシージャまで送ってハンドリングすることをお勧めします。

で、送り方ですが...

As* st = new As();//構造体をnew
PostMessage(hwnd,WM_USER+1, reinterpret_cast<WPARAM>(st), NULL );

ですね。
受取は、メッセージポンプでやるのではなくプロシージャに送られてくるのを待ったほうがいいでしょう。
その場合のキャスト方法はすでに出てるので省略。

少なくとも、PostMessage と GetMessage は対になるAPIセットではありません。
ちょっと気になったんで...

引用返信 編集キー/
■33961 / inTopicNo.7)  Re[2]: postmessageでnewしたデータを送る。
□投稿者/ 相場 (2回)-(2009/03/14(Sat) 02:48:51)
皆様色々と回答ありがとうございました。
同じプロセス内で処理を実行しているので、今回の回答を見て
無事希望通りの動作となりました。

改めて、皆様ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -