转自: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资源
com组件详细接口说明:http://blog.csdn.net/haijun286972766/archive/2011/03/25/6278095.aspx