SendMessageまたはPostMessage関数を使用して構造体またはポインタを送信するにはどうすればよいですか?
2 に答える
簡単な例を次に示します。
typedesf struct tagMY_STRUCT{
unsigned int a;
unsigned int b;
unsigned int c;
}MY_STRUCT;
//Some code which sends message
MY_STRUCT *pStruct = new MY_STRUCT;
pStruct->a = 5;
pStruct->b = 4;
pStruct->c = 1;
SendMessage(hWnd, WM_USER + 1, 0, (LPARAM)pStruct);
//WndProc
case (WM_USER + 1) :
{
MY_STRUCT *pStruct = (MY_STRUCT*)lParam);
if(pStruct)
{
int a = pStruct->a;
delete pStruct;
}
}
break;
プロセス間で実行しようとしないでください。最初に IPC の基本を学習してください。
deleteを使用して不要になった構造体へのポインターを解放することを忘れないで ください。
アップデート
Remy Lebeauがコメントで述べたように、SendMessage は WndProc で処理されるまでスレッドをブロックするため、new/malloc を使用してヒープではなくスタックに構造体を割り当てることもできます。これは、ウィンドウのメッセージ キューにメッセージを追加してすぐに戻るPostMessageには適用されないため、ヒープブロックが必要です。
ただし、より複雑なデータ構造体を渡す予定がある場合は、スタックではなくヒープ割り当てをお勧めします。
どこに送信/投稿しますか?
一般に、一方の端で LParam または WParam へのポインターをキャストし、もう一方の端でそれをキャストすることによるインプロセス通信は、かなり簡単です。特にPostMessagingの場合は、ローカルスタックにオブジェクト/構造体/その他を作成しないでください-new()で動的割り当てを使用します。オブジェクトの有効期間を考慮してください。受信者が PostMessaged オブジェクトを保持したり、渡したりする必要がない場合は、delete() する必要があります。
プロセス間通信の場合は、Google で「WM_COPYDATA」を検索します。