我总结的几种简单的调用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  
#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代码 复制代码  收藏代码
  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. }  
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代码 复制代码  收藏代码
  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. }  
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代码 复制代码  收藏代码
  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. }  
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代码 复制代码  收藏代码
  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. }  
int impl3()
{
CoInitialize(NULL);
IMyComPtr Pt(__uuidof(MyCom)) ;
long ret = Pt->Add(1,2);
CoUninitialize();
return 0;
}

 

 

第五种方法:

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 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 组件方法有多种方法,下面是其中的几种示例代码: 1. 使用 CreateInstance 函数创建 COM 对象并调用方法: ``` CoInitialize(NULL); // 初始化 COM 组件 ISomeInterface* pSomeInterface = NULL; HRESULT hr = CoCreateInstance(CLSID_SomeComponent, NULL, CLSCTX_ALL, IID_ISomeInterface, (void**)&pSomeInterface); if (SUCCEEDED(hr)) { pSomeInterface->SomeMethod(); pSomeInterface->Release(); } CoUninitialize(); // 释放 COM 组件 ``` 2. 使用 IDispatch 接口调用 COM 对象的方法: ``` CoInitialize(NULL); // 初始化 COM 组件 IDispatch* pDispatch = NULL; HRESULT hr = CoCreateInstance(CLSID_SomeComponent, NULL, CLSCTX_ALL, IID_IDispatch, (void**)&pDispatch); if (SUCCEEDED(hr)) { VARIANTARG varg1, varg2, varg3; VariantInit(&varg1); VariantInit(&varg2); VariantInit(&varg3); // 设置参数 varg1.vt = VT_I4; varg1.lVal = 1; varg2.vt = VT_BSTR; varg2.bstrVal = SysAllocString(L"Hello"); varg3.vt = VT_BOOL; varg3.boolVal = VARIANT_TRUE; DISPPARAMS dispparams = { &varg1, &varg2, &varg3, 3, 0 }; // 调用方法 VARIANT variantResult; VariantInit(&variantResult); hr = pDispatch->Invoke(DISPID_SomeMethod, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &variantResult, NULL, NULL); // 处理返回值 if (SUCCEEDED(hr)) { // do something with variantResult VariantClear(&variantResult); } VariantClear(&varg1); VariantClear(&varg2); VariantClear(&varg3); pDispatch->Release(); } CoUninitialize(); // 释放 COM 组件 ``` 3. 使用 ATL 的 CComPtr 类模板调用 COM 对象的方法: ``` CoInitialize(NULL); // 初始化 COM 组件 CComPtr<ISomeInterface> pSomeInterface; HRESULT hr = pSomeInterface.CoCreateInstance(CLSID_SomeComponent); if (SUCCEEDED(hr)) { pSomeInterface->SomeMethod(); } CoUninitialize(); // 释放 COM 组件 ``` 以上示例仅供参考,具体实现方式可能因 COM 组件的实现方式和语言而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值