程序間通訊

2022-07-29 11:18:10 字數 3041 閱讀 5827

windows系統下,在程序間通訊或共享資料的方式如下:

郵槽:最簡單的程序間資料共享方式,乙個程序建立並擁有乙個郵槽,其他程序都可以開啟這個郵槽並向其傳送訊息。

管道:其實質是一種共享的記憶體,由乙個程序建立其他程序連線,並可以進行雙向的通訊。

剪貼簿:重要的程序間資料共享方式,所有的程序都可以設定和修改剪貼簿,也都可以從剪貼簿獲取內容。

wm_copydata訊息:訊息巨湧引數wparam和lparam,但wparam和lparam最多是32位的。而wm_copydata訊息的引數不受wparam和lparam資料大小的限制,可以用於在程序間傳遞資料。

windows套接字:可以在不同主機上不同程式間通訊,當然也可以在相同主機上的不同程式間通訊。

動態資料交換(dde):通過維護全域性分配記憶體使的應用程式間傳遞成為可能,其方式是再一塊全域性記憶體中手工放置大量的資料,然後使用視窗訊息傳遞記憶體 指標.這是16位win時代使用的方式,因為在win32下已經沒有全域性和區域性記憶體 了,現在的記憶體只有一種就是虛存。

rpc:遠端過程呼叫,很少使用,因其與unix的rpc不相容。

序列/並行通訊(serial/parallel communication):它允許應用程式通過序列或並行埠與其他應用程式通訊。

com/dcom:通過com系統的**存根方式程序程序間資料交換,但只能夠表現在對介面函式的呼叫時傳遞資料,通過dcom可以在不同主機間傳遞資料。

郵槽:使用郵槽通訊的程序分為服務端和客戶端。郵槽有服務端建立,在建立時需要制定郵槽名,建立後服務端得到郵槽的控制代碼。在郵槽建立後,客戶端可以通過郵槽名,開啟郵槽,在獲得控制代碼後可以向郵槽寫入訊息。缺點:通訊時單向的只有服務端才能從郵槽中讀取訊息,客戶端只能寫入訊息,訊息是先入先出的;通過郵槽通訊的資料可以是任意格式的,但是一條訊息不給大於424位元組;資料時通過網路傳播是使用的是資料報協議,是種不可靠的通訊;通過網路通訊時,客戶端必須知道服務端的主機名或網域名稱。優點:除了在本機內進行程序間通訊外,在主機間也可以通訊。

createmailslot 服務端建立乙個郵槽物件。

getmailslotinfo 服務端獲取郵槽的相關資訊。

setmailslotinfo 服務端修改讀操作時間、超時時間。

伺服器端使用readfile讀取訊息,客戶端使用createfile開啟郵槽,writefile寫入訊息。

管道:一種用於在程序間共享資料的機制,其實質是一段共享記憶體。windows系統為這段共享記憶體設計採用資料流i/o的方式來訪問。由乙個程序讀、另乙個程序寫,類似乙個管道兩端。管道分為匿名管道和命名管道。匿名管道只能栽父子程序間進行通訊,不能再網路間通訊,而且資料傳輸時單項的,只能一段寫,另一端讀。命名管道可以在任意程序間通訊,通訊時雙向的,任意一端都可讀可寫,但同一時間只能有一端讀一端寫。

命名管道

createnamedpipe 建立命名管道。

connecttonewclient pipe服務端監聽客戶端的鏈結。

disconnectnamedpipe 關閉管道鏈結。

客戶端開啟管道使用createfile,呼叫createfile時服務端會收到客戶端的連線,開啟成功後連線管道,並設定管道的讀寫模式。

waitnamedpipe 等待乙個管道變為可用狀態。

setnamedpipehandlestate 設定管道的讀寫模式。

剪貼簿由系統定義,並不屬於任何乙個特定的程序。系統中所有的程序都可以訪問和設定剪貼簿。最大特點是資料傳輸沒有明確的目標,列舉是被動訪問的,設定剪貼簿的程式並不知道所設定的資料什麼時候被哪個程序訪問,剪貼簿中的內容也可以多次訪問,直到新的資料寫入。由於任何乙個程序都可以無限制地訪問剪貼簿,故也是種不可靠的通訊方式。

openclipboard 開啟剪貼簿,獲得剪貼簿的控制代碼。

emptyclipboard 清空剪貼簿中的內容

setclipboarddata 設定剪貼簿的內容。

getclipboarddata 獲取剪貼簿中的資料,可設定獲取資料的格式。

setclipboardviewer 設定剪貼簿的監視視窗,當剪貼簿內容發生變化時,會收到wm_changecbchain和wm_drawclipboard訊息。

getpriorityclipboardformat 檢測剪貼簿中是否有特定格式的資料。

countclipboardfomat 獲取當前剪貼簿中具有的不同格式的資料。

enumclipboardformats 列舉當前剪貼簿中的所有格式。

getupdateclipboardformats 獲取當前剪貼簿的所有格式。

wm_copydata:是個非常特殊的訊息,該訊息可以攜帶乙個比較大的訊息引數,而其他訊息都只能攜帶兩個固定大小的引數。傳送wm_copydata訊息時,wparam引數應該賦值為傳送此訊息的視窗,而lparam訊息引數指向乙個copydatastruct結構型別的變數。訊息傳送時,系統會將copydatastruct及lpdata所指向的內容全部傳送給目標程序。目標程序在收到wm_copydata後,可以從lparam引數中提取資料。

dde可能是最強大的程序間通訊方式,實現也非常複雜。通訊的兩端分為服務端和客戶端,兩端都需要有視窗。

dde會話由客戶端發起,先初始化乙個會話。dde客戶端會向服務端傳送乙個wm_dde_initiate視窗訊息。服務視窗收到此訊息後,根據條件判斷是否需要響應此訊息,如果服務端確定會客戶端建立會話,那麼會返回wm_dde_ack訊息。如果客戶端成功的收到了服務端傳送的wm_dde_ack視窗訊息,那麼會話就已經簡歷,之後就進行資料傳輸。

資料傳輸分為很多方式,可以只傳送乙個單獨的資料項,也可以再簡歷乙個永久資料連線。如果進行獨立資料項傳輸,資料傳輸的單位是資料項。客戶端使用wm_dde_request和wm_dde_poke訊息向伺服器接收和傳送資料項。資料的傳輸使用wm_dde_data訊息。而永久資料連線的簡歷也是通過客戶端發起,客戶端向服務端傳送wm_dde_advise訊息,服務端根據情況作出回應,根據是否能夠簡歷連線而返回不同的wm_dde_ack訊息。終止資料連線使用訊息wm_dde_unadvise。

客戶端還可以使用wm_dde_execute請伺服器傳送命令。幾乎所有的過程都是客戶端發起請求的,而服務端響應,服務端響應的方向大多是傳送乙個wm_dde_ack訊息。

winsock方式略。

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間通訊

實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...

程序間通訊

最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...