C++ Com控件調用


1.假如我們創建的Com組件的工程名叫TestCom,在其中添加了一個接口叫MyCom,接口名會自動命名為IMyCom,在其中添加兩個方法,分別為:

C++代碼   收藏代碼
  1. HRESULT Add([in] long n1,[in] long n2,[out,retval]long * pVal);  
  2. HRESULT Cat([in] BSTR s1,[in] BSTR s2,[out,retval] BSTR * pVal);  

 
編繹成功后,會生成TestCom.dll
注意此時我們生成的Com組件層次即為:TestCom.IMycom.方法;

2.下面總結出調用該Com的幾種方法:

Cpp代碼   收藏代碼
  1. #include "stdafx.h"  
  2. #include <atlbase.h>  
  3. #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代碼   收藏代碼
  1. int impl0()  
  2. {  
  3. CoInitialize(NULL);  
  4. CLSID clsid;  
  5. IID iid;  
  6. HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);  
  7. if(NOERROR != hr){  
  8. MessageBox(NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);  
  9. return -1;  
  10. }  
  11.   
  12. HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);  
  13. if(S_OK != hriid){  
  14. MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);  
  15. return -1;  
  16. }  
  17.   
  18. {  
  19. CComPtr<imycom> pMyCom;  
  20. pMyCom.CoCreateInstance(clsid);  
  21. long ret;  
  22. ret = pMyCom->Add(1,2);  
  23. }  
  24. CoUninitialize();  
  25. return 0;  
  26. }  

 

 

第二種方法:

Cpp代碼   收藏代碼
  1. int impl1()  
  2. {  
  3. CoInitialize(NULL);  
  4. CLSID clsid;  
  5. CLSIDFromProgID(OLESTR("TestCom.MyCom"),&clsid); //"TestCom.MyCom"即為Dll名+Com對象名  
  6. {  
  7. CComPtr<imycom> pMyCom;  
  8. pMyCom.CoCreateInstance(clsid);  
  9. long ret;  
  10. ret = pMyCom->Add(1,2);  
  11. }  
  12. CoUninitialize();  
  13. return 0;  
  14. }  

 

 

第三種方法:

Cpp代碼   收藏代碼
  1. int impl2()  
  2. {  
  3. CoInitialize(NULL);  
  4. IMyComPtr Pt ;  
  5. if (!SUCCEEDED(Pt.CreateInstance(__uuidof(MyCom))))  
  6. {  
  7. DWORD err;  
  8. err = GetLastError();  
  9. char Msg[128]={0};  
  10. sprintf(Msg,"%d",err);  
  11. MessageBox(NULL,Msg,"Err",MB_OK);  
  12. return -1;  
  13. }  
  14. long ret = Pt->Add(1,2);  
  15. CoUninitialize();  
  16. return 0;  
  17. }  

 

 

第四種方法:

Cpp代碼   收藏代碼
  1. int impl3()  
  2. {  
  3. CoInitialize(NULL);  
  4. IMyComPtr Pt(__uuidof(MyCom)) ;  
  5. long ret = Pt->Add(1,2);  
  6. CoUninitialize();  
  7. return 0;  
  8. }  

 

 

第五種方法:

Cpp代碼   收藏代碼
  1. int impl4()  
  2. {  
  3.   CoInitialize(NULL);  
  4.   IMyCom * pMyCom=NULL;  
  5.   
  6.   CLSID clsid;  
  7.   IID iid;  
  8.   HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);  
  9.   if(NOERROR != hr){  
  10.   MessageBox    (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);  
  11. return -1;  
  12. }  
  13.   
  14. HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);  
  15. if(S_OK != hriid){  
  16.   MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);  
  17.   return -1;  
  18. }  
  19.   
  20. if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))  
  21. {  
  22.   DWORD err;  
  23.   err = GetLastError();  
  24.   char Msg[128]={0};  
  25.   sprintf(Msg,"%d",err);  
  26.   MessageBox(NULL,Msg,"Err",MB_OK);  
  27.   return -1;  
  28. }  
  29.   
  30. long ret;  
  31. ret = pMyCom->Add(1,2);  
  32.   
  33. CoUninitialize();  
  34. return 0;  
  35. }  

 

 

 

int main(int argc, char* argv[])
{
return impl0();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM