用代码说话
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;
- }
转载于:https://blog.51cto.com/studoc/282721