2016-12-05 74 views
-2

我尝试SYSTEM_INFO结构发送到使用的SendMessage()第二过程进程间通信SYSTEM_INFO structture

   HWND hDlg1 = FindWindow(NULL, L"5_2"); 
       SYSTEM_INFO si; 
       GetSystemInfo(&si); 
       cs.dwData = STRUCT; 
       cs.cbData = sizeof(SYSTEM_INFO); 
       cs.lpData = &si; 
       if (hDlg1 != NULL) 
       { 
        SendMessage(hDlg1, WM_COPYDATA, (WPARAM)hDlg, (LPARAM)(LPVOID)&cs); 
       } 

接收代码:

   pcds = (PCOPYDATASTRUCT)lParam;   
       SYSTEM_INFO* si; 
       si = (SYSTEM_INFO *)pcds->lpData; 

,并获得随机值

当我尝试receving的这样的数据:

SYSTEM_INFO si; 
si = (SYSTEM_INFO)pcds->lpData; 

有类型“_SYSTEM_INFO”不具有一个重载成员“运算符 - >”错误

+1

@Danh,我认为这不应该是必需的,因为'WM_COPYDATA'复制了数据。更可能的是OP没有遵循关于仅在消息处理期间有效的数据的规则,或者这些过程具有不同的位数。 –

+0

什么是'STRUCT'? 'cs.dwData'应该是'1' –

+0

@BarmakShemirani,你有参考吗?据我所知,'dwData'的含义(如果有的话)是由接收窗口过程定义的。 –

回答

-2

doc上WM_COPYDATA:

当正在发送该消息时,引用的数据不能被 改变通过发送进程的另一个线程。

看来 si是在发送过程中一个局部变量,这就是为什么你得到一个垃圾。作为一个解决方案,您可以使用全局变量 si

UPD:

接收部分必须访问在消息处理程序的数据只(作为消息处理程序返回时,数据是无效的)。

lParam参数仅 消息的处理过程中是有效...如果接收应用程序必须后 SendMessage消息返回访问该数据,它必须将数据复制到本地缓冲器。

+0

我相信在这种情况下,“当这个消息正在发送”的意思是“直到调用SendMessage返回”,所以使用本地变量应该不是一个真正的问题。 –

+0

在发送过程中'si'是一个局部变量与你的报价有什么关系? – EJP

+0

@EJP局部变量在堆栈中并在函数返回时被破坏 – Flanker