程序間通訊最簡單的方式就是傳送wm_copydata訊息。
傳送wm_copydata訊息:
sendmessage(接收視窗控制代碼,
wm_copydata, (wparam)傳送視窗控制代碼, (
lparam)©data);
其中的copydata
為copydatastruct
結構型別,該結構定義如下:
typedef struct tagcopydatastruct copydatastruct, *pcopydatastruct;
注意:該訊息只能由sendmessage()來傳送,而不能使用postmessage()。因為系統必須管理用以傳遞資料的緩衝區的生命期,如果使用了postmessage(),資料緩衝區會在接收方(執行緒)有機會處理該資料之前,就被系統清除和**。此外如果lpdata
指向乙個帶有指標或某一擁有虛函式的物件時,也要小心處理。
如果傳入的控制代碼不是乙個有效的視窗或當接收方程序意外終止時,sendmessage()會立即返回,因此傳送方在這種情況下不會陷入乙個無窮的等待狀態中。
返回值問題,msdn上說如果接收方處理了,返回true,否則返回false,但是本人在實驗時,都是返回0(接收方已經處理)。
接收wm_copydata訊息:
只要用copydatastruct *
pcopydata = (copydatastruct*)lparam;就可以了。接收方應認為這些資料是唯讀的。
由於傳送方在接收方處理wm_copydata訊息完畢前都是處於等待中,所以接收方應當盡快處理wm_copydata訊息。
以乙個簡單的例子來說明如何使用wm_copydata訊息,有二個程式,乙個用來傳送表示當前時間資訊的字串,另乙個接收資料後顯示到編輯框中。例子中有幾點要注意:
1.如何得到當前控制台視窗控制代碼?vs2008下可以直接使用hwnd
getconsolewindow(void);函式。
2.使用char *
ctime(const time_t *timer);將乙個time_t
型別轉化成乙個字串時,函式會在字串末尾加下'\n'
,因為傳送前要將這個'\n'
去掉。
傳送訊息的程式**(vs2008下編譯通過):
#include
#include
<
time.h>
#include
#include
int main()
return 0; }
接收訊息程式**(vc6.0下編譯通過):
程式中的idc_edit_recvmessage
為編輯框的id。
#include
"stdafx.h"
#include
"resource.h"
#include
bool
callback
dlgproc(hwnd
hdlg, uint
message, wparam
wparam, lparam
lparam);
int
apientry
winmain(hinstance
hinstance,
hinstance
hprevinstance,
lpstr
lpcmdline,
int
ncmdshow)
bool
callback
dlgproc(hwnd
hdlg, uint
message, wparam
wparam, lparam
lparam)
break;
case
wm_copydata:
return
true;}
return
false;}
執行結果如下:
Linux程序間通訊(IPC)之一 管道
管道是unix系統ipc的最古老的形式,並且所有的unix系統都提供這種通訊機制,當然也包括linux。這樣利用管道進行ipc管道具有如下限制 1 歷史原因造成管道是半雙工的,資料只能單向流動。如果想雙向通訊,必須要建立兩個管道。2 管道通訊雙方必須有親緣關係的程序之間 父子程序或者兄弟程序之間 2...
程序通訊之 一 訊號機制實驗
unix linux系統的程序間通訊機構 ipc 允許在任意程序間大批量地交換資料。本實驗的目的是了解和熟悉linux支援的訊號量機制 管道機制 訊息通訊機制及共享儲存區機制。一 訊號機制實驗 實驗目的 1 了解什麼是訊號 2 熟悉linux系統中程序之間軟中斷通訊的基本原理 實驗內容 1 編寫程式...
Linux程序間通訊(IPC)之一 管道
管道是unix系統ipc的最古老的形式,並且所有的unix系統都提供這種通訊機制,當然也包括linux。這樣利用管道進行ipc管道具有如下限制 1 歷史原因造成管道是半雙工的,資料只能單向流動。如果想雙向通訊,必須要建立兩個管道。2 管道通訊雙方必須有親緣關係的程序之間 父子程序或者兄弟程序之間 2...