COM 调用方法

 

CLSID_xxx      //com ID标识,com唯一

IID_xxx           //接口ID标识,在一个com中可以存在多个接口,IID_xxx是不一样的.

 

方式一:

通过IUnknown指针获取

  1. //定义IUnknow指针
  2. IUnknown * pUnk = NULL;
  3. //定义接口指针
  4. IFun * pFun = NULL;
  5. HRESULT hr;
  6. /!*首先获取IUnknown指针*/
  7. hr = ::CoCreateInstance(
  8.    CLSID_Fun,            // COM组件的唯一标识
  9.    NULL,
  10.    CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载
  11.    IID_IUnknown,         // 取得 IUnknown 接口指针
  12.    (LPVOID *) &pUnk);    // 返回的IUnknown指针
  13. if( FAILED( hr ) ) 
  14.    TRACE(_T("COM没注册?"));
  15. /!*用IUnknown指针获取COM组件接口指针*/
  16. hr = pUnk->QueryInterface(
  17.     IID_IFun,            // IFun接口ID
  18.     (LPVOID *)&pFun );   
  19. if( FAILED( hr ) )  
  20.    TRACE( _T("没有接口?") );
  21. /*!调用*/
  22. pFun->function();

方式二:

不使用IUnknown指针.直接获取COM接口指针

  1. //定义接口指针 
  2. IFun * pFun = NULL;
  3. HRESULT hr;
  4. /!*直接获取IFun指针*/
  5. hr = ::CoCreateInstance(
  6.    CLSID_Fun,            // COM组件的唯一标识 
  7.    NULL,
  8.    CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载 
  9.    IID_IFun,             // IFun接口ID 
  10.    (LPVOID *) &pFun);    // 返回的IFun指针 
  11. if( FAILED( hr ) ) 
  12.    TRACE(_T("COM没注册或者没有接口."));
  13. /*!调用*/
  14. pFun->function();

方式三:

智能指针头文件<atlbase.h>

使用智能指针 CComPtr<interface>

  1. CComPtr < IUnknown > pUnk;      // 定义 IUnknown 的智能指针
  2. CComPtr < IFun > pFun;          // 定义 IFun 的智能指针
  3. HRESULT hr;
  4. //使用 CLSID 启动组件
  5. hr = pUnk.CoCreateInstance( CLSID_Fun );
  6. if( FAILED( hr ) ) 
  7.     TRACE( _T("没注册组件?") );
  8. hr = pUnk.QueryInterface(&pFun);
  9. if( FAILED( hr ) )  
  10.     TRACE( _T("没有接口.") );
    • /*!调用*/
    • pFun->function();

方式四:

使用智能指针 CComQIPtr<interface>

  1. CComQIPtr < IFun , &IID_IFun > pFun;    // 定义 IFun 的智能指针
  2. HRESULT hr;
  3. hr = pFun.CoCreateInstance( IID_IFun );
  4. if( FAILED( hr ) )
  5.     TRACE( _T("没注册组件或没有接口") );
    • /*!调用*/
    • pFun->function();

 

注:

智能指针的释放

  1. void fun()
  2. {
  3.   ::CoInitialize( NULL );  //如果在这里初始化,则要注意智能指针的释放 
  4.   CComQIPtr < IFun , &IID_IFun > pFun;    // 定义 IFun 的智能指针  
  5.   HRESULT hr;
  6.   hr = pFun.CoCreateInstance( IID_IFun );
  7.   ASSERT( FAILED( hr ))
  8.   /*!调用*/
  9.   pFun->function();
  10.   //spFun->Release();   // 错!! 
  11.   spFun.Release();  // 正解 
  12. }

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白錵錵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值