如何使用 SendMessage 或 PostMessage 函数发送结构或指针?
问问题
9222 次
2 回答
8
这是一个简单的例子:
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释放指向 struct 的指针。
更新
正如Remy Lebeau在评论中提到的那样,您还可以使用 new/malloc 在堆栈上分配结构,而不是在堆上,因为SendMessage会阻塞线程,直到它在 WndProc 中处理。这不适用于将消息添加到窗口的消息队列并立即返回的PostMessage,所以它需要堆块。
但是,如果您打算传递更复杂的数据结构,我建议使用堆分配而不是堆栈。
于 2012-09-19T09:12:59.053 回答
0
发送/邮寄到哪里?
通常,通过在一端转换指向 LParam 或 WParam 的指针并将其转换回另一端来进行进程内通信是相当简单的。不要在本地堆栈上创建对象/结构/任何东西,尤其是在 PostMessaging 时 - 使用带有 new() 的动态分配。考虑对象的生命周期——如果接收者不需要保留 PostMessaged 对象或传递它,它应该 delete() 它。
对于进程间通信,谷歌搜索“WM_COPYDATA”。
于 2012-09-19T08:55:06.050 回答