1.建立COM對象(comdll.classname)
IDispatch* CreateClassComDispatch(BSTR sClassName)<br />{<br /> CLSID clsid;<br /> IUnknown *pUnk;<br /> IDispatch *pDisp;<br /> HRESULT hr;<br /> CLSIDFromProgID(sClassName, &clsid);<br /> hr = CoInitialize(NULL);<br /> if(FAILED(hr))<br /> return FALSE;<br /> hr = CoCreateInstance(clsid,NULL,CLSCTX_ALL,IID_IUnknown,(void**)&pUnk);<br /> if(FAILED(hr))<br /> return FALSE;<br /> hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);<br /> if(FAILED(hr))<br /> {<br /> pUnk->Release();<br /> return FALSE;<br /> }<br /> return pDisp;<br />}
2.調用
BOOL retValue;<br /> HRESULT hr;<br /> DISPID idd;<br /> VARIANTARG varResult;<br /> IDispatch *pDisp;<br /> try<br /> {<br /> VariantInit(&varResult);<br /> retValue = TRUE;<br /> //對應組件<br /> _bstr_t bstrCom = _bstr_t(libName);<br /> pDisp = CreateClassComDispatch(bstrCom);<br /> if(pDisp == NULL)<br /> return NULL;<br /> //方法名<br /> LPOLESTR str = L".......";<br /> //參數初始化<br /> int ParamsNumber = 2;<br /> VARIANTARG avarParams[2];<br /> for(int i=0;i<ParamsNumber;i++){<br /> ::VariantInit( &avarParams[i] );<br /> }<br /> _bstr_t bstrTemp = _bstr_t(lpPassword);<br /> avarParams[0].vt = VT_BSTR;<br /> avarParams[0].bstrVal = bstrTemp.copy();<br /> _bstr_t bstrTemp1 = _bstr_t(lpFileName);<br /> avarParams[1].vt = VT_BSTR;<br /> avarParams[1].bstrVal = bstrTemp1.copy();<br /> DISPPARAMS params = { avarParams, NULL, ParamsNumber, 0 };<br /> //得到ID<br /> hr = pDisp->GetIDsOfNames(IID_NULL,&str,1,NULL,&idd);<br /> if(!FAILED(hr))<br /> {<br /> hr = pDisp->Invoke(idd, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, ¶ms, &varResult, NULL, NULL);<br /> if(FAILED(hr))<br /> retValue = FALSE;<br /> }<br /> else<br /> {<br /> retValue = FALSE;<br /> }<br /> for(int j=0;j<ParamsNumber;j++){<br /> ::VariantClear( &avarParams[j] );<br /> }<br /> ::VariantClear(&varResult);</p><p> if(!retValue)<br /> return NULL;<br /> else<br /> return (HBITMAP)varResult.lVal;<br /> }<br /> catch(...)<br /> {<br /> }<br /> return NULL;
3.釋放
::CoUninitialize();