2012-04-08 55 views
5

我使用WM_COPYDATA來啓用我的兩個進程A和B之間的通信。與基本數據類型交換數據沒有問題。將接口傳遞給另一個進程

現在我遇到了一個問題,在某些情況下,我想將流程A中的接口(IDispatch)傳遞給我的流程B.可能嗎?

+1

沒有WM_COPYDATA的直接經驗。但是,你檢查了這個 - http://www.codeproject.com/Articles/5307/Use-WM_COPYDATA-to-send-data-to-from-C-and-C-Windo。 Joseph Newcomer似乎也認爲這是可能的 - http://www.flounder.com/wm_copydata.htm(他通常對Win32的所有東西都是正確的) – Gangadhar 2012-04-08 05:09:46

+0

@Gangadhar這是一個非常不錯的鏈接。問題來自所有數據必須被序列化到WM_COPYDATA緩衝區的事實 - 您可以手動完成(如作者所建議的那樣),或者依靠自動編組,如COM或mORMot。 – 2012-04-08 08:19:01

+1

也許我完全不在,但[ObjectFromLresult](http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd373605%28v=vs.85%29.aspx)和[LresultFromObject ](http://msdn.microsoft.com/en-us/library/windows/desktop/dd318557%28v=vs.85%29.aspx)? – kobik 2012-04-08 09:21:15

回答

12

不可能將接口指針直接傳遞給另一個進程。像任何其他指針一樣,接口僅在進程地址空間中有效,並在運行時對其進行實例化。 COM擁有自己的機制來跨進程邊界封送接口和數據,甚至跨同一進程中的不同公寓。在接口的情況下,涉及在每個進程/公寓中運行的代理和存根,並使用各種IPC機制(例如管道,RPC或TCP/IP)相互通信。看看這些文章對於如何在過程中使用接口/公寓來完成:

Inter-Object Communication

Understanding Custom Marshaling Part 1

要做到你所要求的,不訴諸實現自定義編組,你就必須使其中一個進程充當進程外COM服務器,然後另一個進程可以使用CoCreateInstance()GetActiveObject()獲取指向服務器對象的接口指針,該對象在其本地地址空間內工作,並讓COM處理編組細節爲你。

8

它不能直接完成,但可以使用客戶端 - 服務器服務框架,它可能是基於接口的。

例如,看到我們的開源mORMot框架的最後一個特徵:Interface based services sample codethis link。可以在遠程進程上執行interface。該功能處理框架的所有通信方式,即進程內調用,GDI消息,命名管道和TCP/HTTP。在內部,它將使用WM_COPYDATA作爲GDI消息,然後將參數和結果作爲JSON傳輸。使用this link下載源代碼(使用http://synopse.info/fossil 1.16+版本)和文檔(有幾頁關於如何實現這些服務)。

這是一個開源項目,與Delphi 6一起工作到XE2。您也可以使用SOAP或DataSnap客戶端服務器(如果您有相應版本的Delphi)或n層商業軟件包(如http://www.remobjects.com/da)公開接口。這與mORMot中實現的方法類似。

COM也是一個很好的候選者,它是Windows的原生代碼,但初始化起來比較困難:您必須在每臺PC上註冊COM(具有管理員權限),您將無法做到這一點通過網絡工作(DCOM已棄用,請記住)。如果您希望將服務與其他語言(如.Net)共享,但僅在本地進行共享,則COM很好。