用代碼說話
ComTest實現了兩個接口,ICmd和IStr,ICmd裡有一個函數--Add,IStr裡有一個函數--Cat,此處旨在說明智能指針的用法,故不列出,附件裡是工程代碼,COM組件就不給出源碼了
- #include <atlbase.h>
- #include <atlcom.h>
- #if 0
- #import "ComTest.tlb" no_namespace //第三種方法用到此行 導入tlb類型庫 不使用名稱空間
- #endif
- //以下二行為第一 二種方法使用
- #include "ComTest_i.c"
- #include "ComTest.h"
- #include <stdio.h>
- #include <stdlib.h>
- using namespace ATL;
- int main()
- {
- CoInitialize(NULL);
- #if 0
- //第三種方法
- ICmdPtr cmd = NULL; //聲明一個ICmdPtr智能指針,並創建實例 同ADO使用比較相似
- cmd.CreateInstance(__uuidof(Cmd));
- int sum;
- cmd->Add(1,2,&sum);
- printf("%d\n" , sum);
- cmd.Release();//佛曰:不可少,不可少
- //第一種方法
- CComPtr<IUnknown> pUnk;//定義智能指針
- CComQIPtr<ICmd> pCmd;
- HRESULT hr;
- hr = pUnk.CoCreateInstance(CLSID_Cmd , NULL , CLSCTX_INPROC);//在指針的COM創建IUnknown實例,比較繞,理解就行了
- hr = pUnk.QueryInterface(&pCmd);//等同於創建ICmd的對象
- int sum;
- hr = pCmd->Add(1,2,&sum);
- printf("%d\n",sum);
- //切記要Release
- pUnk.Release();
- pCmd.Release();
- #endif
- //第二種方法
- CComPtr<IUnknown> pUnk;
- pUnk.CoCreateInstance(CLSID_Cmd , NULL , CLSCTX_INPROC);//同第一種方法
- CComQIPtr<ICmd> pCmd=pUnk; //創建ICmd對象
- CComQIPtr<IStr> pStr=pUnk; //創建IStr對象
- int sum;
- pCmd->Add(1,2,&sum);
- printf("%d\n",sum);
- CComBSTR bstr;
- pStr->Cat((BSTR)"d",(BSTR)"e",&bstr);
- printf("%S\n",bstr);
- //Release是不能少的
- pStr.Release();
- pCmd.Release();
- pUnk.Release();
- CoUninitialize();
- system("pause");
- return EXIT_SUCCESS;
- }
本文出自 “Studoc” 博客,請務必保留此出處http://studoc.blog.51cto.com/1284909/282721