1.假如我們創建的Com組件的工程名叫TestCom,在其中添加了一個接口叫MyCom,接口名會自動命名為IMyCom,在其中添加兩個方法,分別為:
C++代碼 ?
HRESULT?Add([in]?long?n1,[in]?long?n2,[out,retval]long?*?pVal);??HRESULT?Cat([in]?BSTR?s1,[in]?BSTR?s2,[out,retval]?BSTR?*?pVal);?? HRESULT Add([in] long n1,[in] long n2,[out,retval]long * pVal);
HRESULT Cat([in] BSTR s1,[in] BSTR s2,[out,retval] BSTR * pVal);
?
編繹成功后,會生成TestCom.dll
注意此時我們生成的Com組件層次即為:TestCom.IMycom.方法;
2.下面總結出調用該Com的幾種方法:
Cpp代碼 ?
#include?"stdafx.h"??#include?<atlbase.h>??#import?"G:\\workspace\\VC_WorkSpace\\TestCom\\Debug\\TestCom.dll"?no_namespace?? #include "stdafx.h"
#include <atlbase.h>
#import "G:\\workspace\\VC_WorkSpace\\TestCom\\Debug\\TestCom.dll" no_namespace
?
/*
注意:在導入了com的dll后,會在工程的exe目錄下生成兩個文件:TestCom.tlh與TestCom.tli,一個為定義文件,一個為實現文件,打開TestCom.tlh定義文件,會發現有類似這樣幾句:
_COM_SMARTPTR_TYPEDEF(IMyCom, __uuidof(IMyCom)); //該宏定義了指向接口IMyCom的指針IMyComPtr,以后的程序中可以直接用IMyComPtr這個指針類型。
struct __declspec(uuid("92e83a37-399a-47b1-bf6c-0ab052650cfe"))
MyCom; //該句定義了CLSID為"{92e83a37-399a-47b1-bf6c-0ab052650cfe}",通過它我們可以通過CLSIDFromString獲取clsid;
struct __declspec(uuid("103b4c6e-3d3e-4e38-ab50-b9348465fc13"))
IMyCom : IDispatch //該句定義了接口ID:IID為"{103b4c6e-3d3e-4e38-ab50-b9348465fc13}",通過它我們可以通過IIDFromString獲取接口iid;
CoCreateInstance函數就用到了上面兩個做為參數來創建Com對象.
*/
第一種方法:
Cpp代碼 ?
int?impl0()??{??CoInitialize(NULL);??CLSID?clsid;??IID?iid;??HRESULT?hr?=?CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);??if(NOERROR?!=?hr){??MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);??return?-1;??}????HRESULT?hriid?=?IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);??if(S_OK?!=?hriid){??MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);??return?-1;??}????{??CComPtr<imycom>?pMyCom;??pMyCom.CoCreateInstance(clsid);??long?ret;??ret?=?pMyCom->Add(1,2);??}??CoUninitialize();??return?0;??}?? int impl0()
{
CoInitialize(NULL);
CLSID clsid;
IID iid;
HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);
if(NOERROR != hr){
MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);
return -1;
}HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);
if(S_OK != hriid){
MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);
return -1;
}{
CComPtr<imycom> pMyCom;
pMyCom.CoCreateInstance(clsid);
long ret;
ret = pMyCom->Add(1,2);
}
CoUninitialize();
return 0;
}
?
?
第二種方法:
Cpp代碼 ?
int?impl1()??{??CoInitialize(NULL);??CLSID?clsid;??CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid);???{??CComPtr<imycom>?pMyCom;??pMyCom.CoCreateInstance(clsid);??long?ret;??ret?=?pMyCom->Add(1,2);??}??CoUninitialize();??return?0;??}?? int impl1()
{
CoInitialize(NULL);
CLSID clsid;
CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid); //"TestCom.MyCom"即為Dll名+Com對象名
{
CComPtr<imycom> pMyCom;
pMyCom.CoCreateInstance(clsid);
long ret;
ret = pMyCom->Add(1,2);
}
CoUninitialize();
return 0;
}
?
?
第三種方法:
Cpp代碼 ?
int?impl2()??{??CoInitialize(NULL);??IMyComPtr?Pt?;??if?(!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom))))??{??DWORD?err;??err?=?GetLastError();??char?Msg[128]={0};??sprintf(Msg,"%d",err);??MessageBox(NULL,Msg,"Err",MB_OK);??return?-1;??}??long?ret?=?Pt->Add(1,2);??CoUninitialize();??return?0;??}?? int impl2()
{
CoInitialize(NULL);
IMyComPtr Pt ;
if (!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom))))
{
DWORD err;
err = GetLastError();
char Msg[128]={0};
sprintf(Msg,"%d",err);
MessageBox(NULL,Msg,"Err",MB_OK);
return -1;
}
long ret = Pt->Add(1,2);
CoUninitialize();
return 0;
}
?
?
第四種方法:
Cpp代碼 ?
int?impl3()??{??CoInitialize(NULL);??IMyComPtr?Pt(__uuidof(MyCom))?;??long?ret?=?Pt->Add(1,2);??CoUninitialize();??return?0;??}?? int impl3()
{
CoInitialize(NULL);
IMyComPtr Pt(__uuidof(MyCom)) ;
long ret = Pt->Add(1,2);
CoUninitialize();
return 0;
}
?
?
第五種方法:
Cpp代碼 ?
int?impl4()??{????CoInitialize(NULL);????IMyCom?*?pMyCom=NULL;??????CLSID?clsid;????IID?iid;????HRESULT?hr?=?CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);????if(NOERROR?!=?hr){????MessageBox????(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);??return?-1;??}????HRESULT?hriid?=?IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);??if(S_OK?!=?hriid){????MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);????return?-1;??}????if?(!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))??{????DWORD?err;????err?=?GetLastError();????char?Msg[128]={0};????sprintf(Msg,"%d",err);????MessageBox(NULL,Msg,"Err",MB_OK);????return?-1;??}????long?ret;??ret?=?pMyCom->Add(1,2);????CoUninitialize();??return?0;??}?? int impl4()
{CoInitialize(NULL);IMyCom * pMyCom=NULL;CLSID clsid;IID iid;HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);if(NOERROR != hr){MessageBox (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);
return -1;
}HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);
if(S_OK != hriid){MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);return -1;
}if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))
{DWORD err;err = GetLastError();char Msg[128]={0};sprintf(Msg,"%d",err);MessageBox(NULL,Msg,"Err",MB_OK);return -1;
}long ret;
ret = pMyCom->Add(1,2);CoUninitialize();
return 0;
}
?
?
?
int main(int argc, char* argv[])
{
return impl0();
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的我总结的几种简单的调用Com组件的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。