1.創建一個ATL COM AppWizard工程,如圖:
2. 選擇 Dynamic link Library (DLL),其它兩個請百度,或參照其它文檔。如下圖:
3. 添加一個自己的COM類,用於導出需要用到的接口。步驟如下:
選擇類視圖->右鍵工程->新建類(New Class) 如下圖:

彈出對話框后,選擇 ATL CLASS,輸入類名,如下圖:
然后,在類視圖中,你會看到:

多了一個接口和一個類,這都是你剛才添加的。
4. 添加導出接口。
右鍵 "IHelloWorld"->AddMethod,如下圖:

彈出對話框,填寫函數名及參數即可,如下圖:
然后,我們再看 IHelloWord, 如下圖:

接口已經有了,而且它已經自動在 CHellowWorld 類中加了實現代碼,雙擊這個上圖中的選中的Show就會跳轉到定義,如下圖:

作為示例,我們彈出一個消息框好了,代碼如下:
STDMETHODIMP CHellowWorld::Show(int iWhat) { // TODO: Add your implementation code here TCHAR szMsg [512] = {0}; sprintf(szMsg, "Hello World - iWhat:%d", iWhat); MessageBox (NULL, szMsg, "First Com Project", MB_OK | MB_TOPMOST); return S_OK; }
到這里,我們編譯生成一下。
5. 注冊COM組件,可以使用命令行進行注冊,regsrv32 xxx.dll,不過為了方便,我們不准備使用手工,我們可以在鏈接完成后直接注冊,設置工程,設置如下:
6.編寫調用例程。
創建一個控制台項目,項目源碼如下:
#include "stdafx.h" #include "../ComDemo.h" #include "../ComDemo_i.c" int main(int argc, char* argv[]) { CoInitialize(NULL); IHellowWorld* pHello = NULL; IUnknown * pUnk = NULL; HRESULT hr; //(2)創建實例對象,獲取IUnknown接口指針 hr = ::CoCreateInstance( CLSID_HellowWorld, NULL, CLSCTX_INPROC_SERVER, // 以進程內組件 DLL 方式加載 IID_IUnknown, // 想取得 IUnknown 接口指針 (LPVOID *) &pUnk); if( FAILED( hr ) ) { printf("沒注冊吧\n"); return -1; } hr=pUnk->QueryInterface(IID_IHellowWorld,(LPVOID *)&pHello); if (FAILED (hr)) { printf("QueryInterface hello2 失敗\n"); return -1; } pHello->Show (2); CoUninitialize(); return 0; }
其中的 ComDemo.h 和 ComDemo_i.c,請看一下COM組件的文件視圖,截圖如下:

然后運行一下就可以看到效果了。
參考資料:
http://hi.baidu.com/laocui172/item/c0bac2ab45e35f9e151073ae
http://xulin.blog.51cto.com/264387/84852
