2012-10-20 44 views
2

我正在學習如何實現一個進程外COM服務器,並且遇到了this article沒有代理/存根DLL的進程外COM服務器?

我可以構建它,它運行良好,但代理/存根DLL在哪裏?我所能看到的只是在構建過程中從中生成代理/存根代碼的IDL文件。但是,DLL是如何構建的?它在哪裏?

回答

4

簡短的回答是,所有的接口都標有 「了oleautomation」,這樣的oleaut32.dll進行封送處理,因爲COM知道如何以封送接口中使用的所有類型。

如果缺少「oleautomation」,或者指定的類型是COM不知道如何默認編組(see the list here),則需要您的非默認封送拆分器及其存根。

+0

啊,很好的信息 - 謝謝! – Dabbler

2

您需要Proxy/Stub項目來幫助COM編組您的接口。當您使用Visual Studio創建ATL C++項目時,通常會自動創建一個PS後綴的輔助項目,這是您的代理/存根DLL。然而,如果沒有它,你可能會做得很好(我個人從來沒有必要構建和使用它,儘管我不得不處理諸如自定義編組之類的事情)。如果您的項目提供了類型庫,它將被註冊並且符合某些條件 - COM將爲您提供自動代理/存根對。

獎金閱讀:

+0

好的,謝謝。我會閱讀你提供的鏈接,由於代理/存根DLL似乎是可選的,我會考慮回答這個問題。你能推薦任何關於學習COM的書嗎?我有Dale Rogerson的Inside COM,我認爲它在解釋進程內服務器方面做得非常好,但當它到達EXE中的服務器時會有點膚淺。 – Dabbler

+0

我認爲這是我讀過的唯一一本關於COM的書,我認爲它很好。對我來說,除了袖口還有其他建議,我認爲只有基礎知識才能做得很好,並且要小心翼翼地做出步驟,理解自己在做什麼。 EXE服務器與in-procs沒有多少區別,所有的API在MSDN上都有詳細記錄。 –

+0

事情並非如此簡單,您仍然需要註冊'HKCR \ Interface \ {iid} \ ProxyStubClsid32'和TypeLib鍵以獲得使用類型庫的標準編組器。 CLSID是{00000320-0000-0000-C000-000000000046}。如果你沒有,它仍然有效,那麼你很可能違反了公寓規則,而不是封送接口指針。 –

相關問題