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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM