訊息作用:在程序間共享資料(內部通過建立記憶體對映檔案)
訊息介紹:
需要用到的資料結構/型別:
typedef
struct
tagcopydatastruct copydatastruct, *pcopydatastruct;
結構體引數說明:
dwdata(ulong) 儲存乙個數值, 可以用來作標誌等
lpdata(
void*) 待傳送的資料的起始位址(可以為null)
cbdata(dword) 待傳送的資料的長度
訊息的引數:
hwnd: 接收資料的視窗的控制代碼
wparam: 傳送該資料的視窗控制代碼(null也無所謂)
lparam: copydatastruct型別變數的位址
使用示例:
copydatastruct cds;
char msg = "
女孩不哭";
cds.dwdata = 0
; cds.lpdata =msg;
cds.cbdata = strlen(msg)+1; //
字串請記得把'\0'加上, 不然就錯了, 這裡是ansi字串
sendmessage(findwindow("
nbsg_class
", null), wm_copydata, 0, (lparam)&cds);
接收端對該訊息的一種可能處理:
case
wm_copydata:
說明:傳送的資料可以是任意的, 我上面只是為了用messagebox做測試, 所以傳送的是以'\0'的字串.
如果接收訊息的應用程式處理了該訊息, 它應該返回 true , 否則返回 false.
lpdata 指向的記憶體應該是一段"資料
", 就是說裡面不應該有指向該程式某資料的指標. 因為 sendmessage 在處理 wm_copydata 時, 只是把 lpdata 指向的 cbdata 個位元組複製到共享記憶體中. 當前程序私有的指標就算是被傳送到接收程式, 其也是無法訪問的.
當該訊息正當傳送時, 該程序的其它執行緒不能修改其中的資料.
接收端應用程式應該把這段共享記憶體作為唯讀記憶體來訪問. 請不要嘗試修改其中的內容.
lparam 指向的資料只有在該訊息處理時有效, 訊息返回後無效(共享記憶體已被釋放). 且接收端也不能釋放該記憶體. 如果要在訊息返回後繼續取得資料, 可以把它複製到當前程序的某個位置.
驅動程式和應用程式之間通訊
正文 q 請問有什麼方法實現驅動程式主動和應用程式進行實時通訊,而不用應用程式採用定時查詢的方法?比如驅動有一事件發生需要立即通知應用程式,或驅動程式需要向應用程式讀取一些內容.a 有乙個很容易的方式,在驅動程式和應用程式之間用乙個事件。在應用程式createfile的時候,驅動程式iocreate...
驅動程式與應用程式之間的通訊
驅動程式與應用程式之間的通訊 驅動程式必須與應用程式進行通訊,才能最終達到應用程式控制裝置的目的,不然驅動有qiu用。要通訊就涉及到3個方面 1.應用程式與驅動程式通訊 2.驅動程式與應用程式通訊 3.資料傳輸 下面分別討論 1。應用程式與驅動程式通訊 2。驅動程式與應用程式通訊 2 1 驅動程式在...
EXE之間通訊
而且還有好幾種方法。1 傳送訊息傳遞 2 共享記憶體傳遞 3 使用com程序外伺服器 這篇文章主要說明一下,如何利用傳送訊息使兩個exe完成通訊。其他兩個方法感興趣可以搜尋下,都可以找到相應 傳送端 public partial class mainwindow window structlayou...