2016-12-05 105 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