它已經我已經好久沒寫了一個COM DLL。我已經做了幾個類,從一些COM接口繼承,但我想測試它。我知道我必須在某處放置一個GUID,然後用regsvr32註冊它,但涉及的步驟是什麼?如何在Visual Studio 2008中創建一個COM DLL?
編輯:對不起,忘了提我使用C++。
它已經我已經好久沒寫了一個COM DLL。我已經做了幾個類,從一些COM接口繼承,但我想測試它。我知道我必須在某處放置一個GUID,然後用regsvr32註冊它,但涉及的步驟是什麼?如何在Visual Studio 2008中創建一個COM DLL?
編輯:對不起,忘了提我使用C++。
要創建您可以進行如下一個新的ATL COM項目:
您創建了一個新的DLL,但它是空的,添加一個COM對象,你可以這樣做:
如果您想一個對象實現接口
PS:這是很容易在不同的創建具有相同名稱的一個新的ATL項目文件夾,並添加您自定義的文件。該向導執行幾項任務並創建幾個定製文件。
對於難以按文件添加文件的較大項目,我也是這樣做的,但不是將文件添加到新項目中,而是開始將設置從新項目複製到舊項目,然後添加任何其他文件該向導已創建並修復stdafx.h頭文件以合併新設置。
PPS:如果你想讓你的dll支持MFC,而不是選擇ATL Project,你必須選擇MFC/MFC Dll。當您添加ATL簡單對象時,嚮導會要求將ATL支持添加到項目中。
當你構建解決方案,它會自動註冊DLL。 並且它還創建兩個文件_i.c和.h文件。
要測試的DLL創建示例應用程序:
創建示例Win32應用程序。包括其中具有主要功能
調用CoInitialize()Win32應用程序的cpp文件的_i.c和.h;
聲明接口指針 CComPtr pMyInterface = NULL; //其中IMyInterface的在_i.c
被聲明創建實例 pMyInterface.CoCreateInstance(CLSID_MyClass); // CLSID_MyClass是表示
的CoClass
呼叫存在於接口API的
調用CoUninitialize()GUID;
您需要編寫一個名爲DllGetClassObject的函數並將其導出。該函數負責分配一個「類工廠」,您還必須編寫這個類工廠,並且該工廠又可以分配COM對象的實例。它必須執行IClassFactory。
這並不難。另一種方法是使用ATL(請參閱xhantt的答案),理論上這是爲你做的,但實際上這是一團糟。它以某種方式管理將COM的複雜性封裝在更復雜的抽象層中。例如,祝您嘗試在DLL之間移動對象。
但是,您可以運行ATL嚮導來查看如何聲明DllGetClassObject
的示例。實現IClassFactory
非常簡單 - 只需要一個方法來記錄一個對象。
然後,您需要註冊您的DLL - 即將密鑰放入註冊表中。如果沒有您的進一步幫助,regsvr32
工具無法做到這一點。您必須編寫並導出另一個名爲DllRegisterServer的函數,該函數完成所有艱苦的工作。 regsvr32
所做的就是加載DLL,查找DllRegisterServer
並調用它。
同樣,ATL有一種方法可以爲你實現,但它通過閱讀一種腳本來完成註冊表修改指令,存儲在一個嵌入到DLL資源中的.rgs文件中。如果您不小心將任何類型的語法錯誤添加到此文件中,註冊失敗時會失敗。
所以,再次,你可能會發現,編寫幾行代碼來自己調整註冊表會更簡單。 Here are the details。
如果您改用C#,則不會有任何這些問題。一切都封裝得很乾淨。它實際上比C++作爲開發COM對象的工具要好得多。
我構建了一個bog標準的Win32項目,不包括ATL/MFC。我需要知道如何設置項目設置才能使其作爲COM DLL正確構建。 – 2009-01-21 20:03:29
您可以參考以下鏈接http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=88625 – Vinay 2009-01-23 15:17:13