1

如何使用 SendMessage 或 PostMessage 函数发送结构或指针?

4

2 回答 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 回答