C++ Com控件調用
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);
編繹成功後,會生成TestCom.dll
註意此時我們生成的Com組件層次即為:TestCom.IMycom.方法;
2.下面總結出調用該Com的幾種方法:
- #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對象.
*/
第一種方法:
- 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); //"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;
- }
第四種方法:
Cpp代碼- 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 main(int argc, char* argv[])
{
return impl0();
}
C++ Com控件調用