2009-01-21 45 views
7

它已經我已經好久沒寫了一個COM DLL。我已經做了幾個類,從一些COM接口繼承,但我想測試它。我知道我必須在某處放置一個GUID,然後用regsvr32註冊它,但涉及的步驟是什麼?如何在Visual Studio 2008中創建一個COM DLL?

編輯:對不起,忘了提我使用C++。

回答

10

要創建您可以進行如下一個新的ATL COM項目:

  1. 文件/新建項目
  2. 的Visual C++/ATL/ATL項目
  3. 自定義其設置,然後按完成完成後

您創建了一個新的DLL,但它是空的,添加一個COM對象,你可以這樣做:

  1. 項目/添加類
  2. 的Visual C++/ATL/ATL簡單對象,按添加
  3. 有的名稱你想(如MyObject來),然後按完成將其添加

如果您想一個對象實現接口

  1. 在類視圖中選擇對象類(CMyObject)
  2. 右擊t單擊/添加/實現接口...
  3. 您可以選擇界面將實施
    1. 從.idl文件已經在您的項目文件
    2. 從.TLB/.DLL /。EXE其中有一個類型庫的嵌入式
    3. 從一個對象已註冊
  4. 當完成後,按完成

PS:這是很容易在不同的創建具有相同名稱的一個新的ATL項目文件夾,並添加您自定義的文件。該向導執行幾項任務並創建幾個定製文件。

對於難以按文件添加文件的較大項目,我也是這樣做的,但不是將文件添加到新項目中,而是開始將設置從新項目複製到舊項目,然後添加任何其他文件該向導已創建並修復stdafx.h頭文件以合併新設置。

PPS:如果你想讓你的dll支持MFC,而不是選擇ATL Project,你必須選擇MFC/MFC Dll。當您添加ATL簡單對象時,嚮導會要求將ATL支持添加到項目中。

1

當你構建解決方案,它會自動註冊DLL。 並且它還創建兩個文件_i.c和.h文件。

要測試的DLL創建示例應用程序:

  1. 創建示例Win32應用程序。包括其中具有主要功能

  2. 調用CoInitialize()Win32應用程序的cpp文件的_i.c和.h;

  3. 聲明接口指針 CComPtr pMyInterface = NULL; //其中IMyInterface的在_i.c

  4. 被聲明創建實例 pMyInterface.CoCreateInstance(CLSID_MyClass); // CLSID_MyClass是表示
    的CoClass

  5. 呼叫存在於接口API的

  6. 調用CoUninitialize()GUID;

+0

我構建了一個bog標準的Win32項目,不包括ATL/MFC。我需要知道如何設置項目設置才能使其作爲COM DLL正確構建。 – 2009-01-21 20:03:29

+0

您可以參考以下鏈接http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=88625 – Vinay 2009-01-23 15:17:13

3

您需要編寫一個名爲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對象的工具要好得多。

相關問題