天天看點

24、Windows API 程序間通信,其他程序間通信方式

1、動态資料交換(DDE)和網絡動态資料交換(NDDE)[1,2]<?xml:namespace prefix = o />

DDE可能是最為強大的程序間通信方式,實作也非常複雜。通信的兩端分為服務端與用戶端,兩端都需要具有視窗。

一個DDE的通信過程大緻如下:

DDE會話由用戶端發起,先初始化一個會話。DDE用戶端會向服務端發送一個WM_DDE_INITIATE視窗消息。服務視窗收到此消息後,根據條件判斷是否需要響應此消息,如果服務端确定可以與用戶端建立會話,那麼會傳回WM_DDE_ACK消息。如果用戶端成功收到了服務端發送的WM_DDE_ACK視窗消息,那麼會話就已經建立,之後就進行資料的傳輸。

資料傳輸分為很多種方式,可以隻傳輸一個單獨的資料項,也可以再建立一個永久資料連接配接( Permanent Data Link)。

如果進行獨立資料項傳輸,資料傳輸的機關是資料項。用戶端使用WM_DDE_REQUEST和WM_DDE_POKE消息向服務端接收和發送資料項。資料的傳輸使用WM_DDE_DATA消息。

而永久資料連接配接的建立也是通過用戶端發起,用戶端向服務端發送WM_DDE_ADVISE消息,服務端根據情況做出回應,根據是否能夠建立連接配接而傳回不同的WM_DDE_ACK消息。終止資料連接配接使用消息WM_DDE_UNADVISE。

用戶端還可以使用WM_DDE_EXECUTE請服務端發送指令。

終止一個DDE會話使用WM_DDE_TERMINATE消息。

幾乎所有的過程都是由用戶端發起請求,而服務端響應,服務端響應的方向大多是發送一個WM_DDE_ACK消息。

DDE的通信需要作業系統ATOM表的幫助,用于索引資料。操作ATOM表有專門的API。

2、通過File Mapping在程序間共享資料[3]

    共享檔案是一種高效的程序間通信方式,因為直接共享記憶體,是以通路速度非常快。而且允許大量資料傳輸。

    共享記憶體的程序間通信與其他程序間通信方式相比,限制條件要少。比如郵槽對資料大小和資料流向有限制,管道隻能采用半雙工通信形式等,剪貼闆容易受其他程序影響等。

使用File Mapping共享資料也有缺點。最大的缺點是無法實作實時性,一個程序無論是寫入還是讀出資料後,另一個程序都不知道對方的操作是否已經完成。是以在要求實時資料傳輸時,File Mapping通常與其他程序通信方式配合使用,用于傳輸大量的資料。

3、Windows Socket

    利用Windows Socket實作的程序間通信借用了Socket通信的原理。其實任何可以在兩台主機間進行網絡資料通信的機制都可以用于程序間通信。

    如果在一台主機上既使用Socket服務端又實作Socket用戶端,那麼用戶端在連接配接服務端時将IP指定為本機,就可以實作同一主機上的Socket服務端程序和Socket用戶端程序間的通信。

    使用Socket進行程序間通信既可以實作實時性,又可以傳輸大資料量資訊,且資料傳輸的速度也很快,是以應用範圍很廣泛。

    在程序間實作Socket通信的原理和程式實作方法與實作不同主機間的Socket通信沒有差別。

參考

[1] 精通Windows API 函數、接口、程式設計執行個體