zoukankan      html  css  js  c++  java
  • C++调用com控件方法

    转载自:http://blog.csdn.net/haijun286972766/article/details/6273414

    最近要求做一个C++调用com组件的DEMO。由于自己对C++并无研究包括IDE工具。后来在网上查阅了些资料,经过努力终于告一段落。

       网上对于C++加载com组件的方法已经说的很多了,我就仅贴下我所使用的方法(不用注册dll,当然网上推荐了一些更简单也更有实际意义的使用方式):

     CLSID clsid;
      HRESULT hr1=CLSIDFromProgID(OLESTR("PTA.iTrusPTA"),&clsid);//获得dll控件的clsid
      typedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**); 
      pfnGCO fnGCO = NULL; 
      HINSTANCE hdllInst = LoadLibrary(L"PTAExt.dll"); //加载dll
      fnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject"); //从dll中得到DllGetClassObject
      if (fnGCO != 0) 
      { 
      
      IClassFactory* pcf = NULL; 
      HRESULT hr=(fnGCO)(clsid, IID_IClassFactory, (void**)&pcf); //创建工厂
    
      if (SUCCEEDED(hr) && (pcf != NULL)) 
      { 
      IiTrusPTA* pFoo = NULL; 
      hr = pcf->CreateInstance(NULL, __uuidof(IiTrusPTA), (void**)&pFoo); //通过工厂创建dll中IiTrusPTA接口
      //调用IiTrusPTA具体的业务操作
      if (SUCCEEDED(hr) && (pFoo != NULL)) 
      { 
       
       ICertFilter *a = pFoo->Filter;
       ICertificatesPtr certs =   pFoo->MyCertificates;
       long temp = certs->Count;
       if(temp>0){
        for(int i=1;i<=temp;i++){
         _variant_t cert = certs->Item[i];
         ICertificatePtr date = (ICertificatePtr)cert.pdispVal;
         _bstr_t name =  date->CommonName;
         ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(name);
         ((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
         }
       }else{
        ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(L"没有找到数字证书");
        ((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);
        
       }
        
    
       }
       
        
       pFoo->Release(); 
      } 
      pcf->Release(); 
      
      } 
      FreeLibrary(hdllInst);//释放dll资源

    整个流程就是通过LoadLibrary()加载dll,然后IClassFactory去创建com组件实例。整个操作过程中遇到唯一的问题处理dll返回的variant类型数据。在具体操作时我们可以根据我们variant中实际存在的类型去variant.*val;获得我们实际值;variant操作空间很大,使用灵活性也很大。因此当我们不能清楚的知道实际的值是什么时,我们可以去尝试强转等方式。(对于variant类型的操作网上也有很多说明。根据网上说明在结合我的代码我相信对于入门的C++程序员来说这个问题都不难解决了)

      com组件详细接口说明:http://blog.csdn.net/haijun286972766/archive/2011/03/25/6278095.aspx

  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/dongc/p/5225106.html
Copyright © 2011-2022 走看看