cpp 掉com

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


 

C++调用com控件方法

分类: C++   419人阅读  评论(0)  收藏  举报

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

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

[cpp]  view plain copy
  1. CLSID clsid;  
  2.  HRESULT hr1=CLSIDFromProgID(OLESTR("PTA.iTrusPTA"),&clsid);//获得dll控件的clsid  
  3.  typedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**);   
  4.  pfnGCO fnGCO = NULL;   
  5.  HINSTANCE hdllInst = LoadLibrary(L"PTAExt.dll"); //加载dll  
  6.  fnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject"); //从dll中得到DllGetClassObject  
  7.  if (fnGCO != 0)   
  8.  {   
  9.    
  10.  IClassFactory* pcf = NULL;   
  11.  HRESULT hr=(fnGCO)(clsid, IID_IClassFactory, (void**)&pcf); //创建工厂  
  12.   
  13.  if (SUCCEEDED(hr) && (pcf != NULL))   
  14.  {   
  15.  IiTrusPTA* pFoo = NULL;   
  16.  hr = pcf->CreateInstance(NULL, __uuidof(IiTrusPTA), (void**)&pFoo); //通过工厂创建dll中IiTrusPTA接口  
  17.  //调用IiTrusPTA具体的业务操作  
  18.  if (SUCCEEDED(hr) && (pFoo != NULL))   
  19.  {   
  20.     
  21.   ICertFilter *a = pFoo->Filter;  
  22.   ICertificatesPtr certs =   pFoo->MyCertificates;  
  23.   long temp = certs->Count;  
  24.   if(temp>0){  
  25.    for(int i=1;i<=temp;i++){  
  26.     _variant_t cert = certs->Item[i];  
  27.     ICertificatePtr date = (ICertificatePtr)cert.pdispVal;  
  28.     _bstr_t name =  date->CommonName;  
  29.     ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(name);  
  30.     ((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);  
  31.     }  
  32.   }else{  
  33.    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(L"没有找到数字证书");  
  34.    ((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);  
  35.      
  36.   }  
  37.      
  38.   
  39.   }  
  40.     
  41.      
  42.   pFoo->Release();   
  43.  }   
  44.  pcf->Release();   
  45.    
  46.  }   
  47.  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


根据题目描述,游游有n个苹果和m个桃子,可以组成两种不同价值的大礼包。一种是价值a元的一号水果大礼包,由2个苹果和1个桃子组成;另一种是价值b元的二号水果大礼包,由1个苹果和2个桃子组成。现在游游想知道,她最多能组成多少价值总和的大礼包。 我们可以通过贪心算法来解决这个问题。贪心算法的思路是每次选择能得到最大价值的大礼包组合,直到无法再选择。 首先,我们可以先尽可能多地选择一号水果大礼包。每次选择一号水果大礼包时,我们可以消耗2个苹果和1个桃子,并获得价值a元。如果剩余的苹果数量小于2或者剩余的桃子数量小于1,就无法再选择一号水果大礼包了。 接下来,如果还有剩余的苹果或者桃子,我们可以选择二号水果大礼包。每次选择二号水果大礼包时,我们可以消耗1个苹果和2个桃子,并获得价值b元。如果剩余的苹果数量小于1或者剩余的桃子数量小于2,就无法再选择二号水果大礼包了。 最后,游游能够得到的最大价值总和的大礼包就是选择一号水果大礼包的次数乘以a,再加上选择二号水果大礼包的次数乘以b。 具体的实现可以参考下面的代码: ```cpp #include <iostream> using namespace std; int main() { int n, m, a, b; cin >> n >> m >> a >> b; int maxPackage = 0; // 尽可能多地选择一号水果大礼包 while (n >= 2 && m >= 1) { maxPackage++; n -= 2; m -= 1; } // 尽可能多地选择二号水果大礼包 while (n >= 1 && m >= 2) { maxPackage++; n -= 1; m -= 2; } int maxTotalValue = maxPackage * max(a, b); cout << maxTotalValue << endl; return 0; } ``` 希望能帮到你!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值