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

  • 相关阅读:
    BZOJ 1499 NOI2005 瑰丽华尔兹 单调队列
    大整数乘法python3实现
    GPIO
    Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
    TCP三次握手和四次挥手具体解释
    vector的成员函数解析
    Yii PHP Framework有用新手教程
    管道(Pipe)/createPipe
    android使用自己定义属性AttributeSet
    ASP连接sql server实例解析
  • 原文地址:https://www.cnblogs.com/dongc/p/5225106.html
Copyright © 2011-2022 走看看