用代码说话

ComTest实现了两个接口,ICmd和IStr,ICmd里有一个函数--Add,IStr里有一个函数--Cat,此处旨在说明智能指针的用法,故不列出,附件里是工程代码,COM组件就不给出源码了

   
   
   
   
  1. #include   
  2. #include   
  3.  
  4. #if 0  
  5. #import "ComTest.tlb" no_namespace   //第三种方法用到此行 导入tlb类型库 不使用名称空间  
  6. #endif  
  7.  
  8. //以下二行为第一 二种方法使用  
  9. #include "ComTest_i.c"  
  10. #include "ComTest.h"  
  11.  
  12. #include   
  13. #include   
  14.  
  15. using namespace ATL;  
  16.  
  17. int main()  
  18. {  
  19.     CoInitialize(NULL);  
  20. #if 0  
  21.     //第三种方法  
  22.     ICmdPtr cmd = NULL; //声明一个ICmdPtr智能指针,并创建实例   同ADO使用比较相似  
  23.     cmd.CreateInstance(__uuidof(Cmd));  
  24.     int sum;  
  25.     cmd->Add(1,2,&sum);  
  26.     printf("%d\n" , sum);  
  27.     cmd.Release();//佛曰:不可少,不可少  
  28.  
  29.     //第一种方法  
  30.     CComPtr pUnk;//定义智能指针  
  31.     CComQIPtr pCmd;  
  32.     HRESULT hr;  
  33.  
  34.     hr = pUnk.CoCreateInstance(CLSID_Cmd , NULL , CLSCTX_INPROC);//在指针的COM创建IUnknown实例,比较绕,理解就行了  
  35.     hr = pUnk.QueryInterface(&pCmd);//等同于创建ICmd的对象  
  36.     int sum;  
  37.     hr = pCmd->Add(1,2,&sum);  
  38.     printf("%d\n",sum);  
  39.     //切记要Release  
  40.     pUnk.Release();  
  41.     pCmd.Release();  
  42. #endif  
  43.     //第二种方法  
  44.     CComPtr pUnk;  
  45.     pUnk.CoCreateInstance(CLSID_Cmd , NULL , CLSCTX_INPROC);//同第一种方法  
  46.     CComQIPtr pCmd=pUnk; //创建ICmd对象  
  47.     CComQIPtr pStr=pUnk; //创建IStr对象  
  48.     int sum;  
  49.  
  50.     pCmd->Add(1,2,&sum);  
  51.     printf("%d\n",sum);  
  52.     CComBSTR bstr;  
  53.     pStr->Cat((BSTR)"d",(BSTR)"e",&bstr);  
  54.     printf("%S\n",bstr);  
  55.     //Release是不能少的  
  56.     pStr.Release();  
  57.     pCmd.Release();  
  58.     pUnk.Release();  
  59.  
  60.     CoUninitialize();  
  61.     system("pause");  
  62.     return EXIT_SUCCESS;