C++ Com控件调用

时间:2023-03-08 18:16:02

1.假如我们创建的Com组件的工程名叫TestCom,在其中添加了一个接口叫MyCom,接口名会自动命名为IMyCom,在其中添加两个方法,分别为:

  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的几种方法:

  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对象.
*/

第一种方法:

  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. HRESULT hriid = IIDFromString(OLESTR("{103b4c6e-3d3e-4e38-ab50-b9348465fc13}"),&iid);
  12. if(S_OK != hriid){
  13. MessageBox(NULL,"ErrIIDFromString","ErrIIDFromString",MB_OK);
  14. return -1;
  15. }
  16. {
  17. CComPtr<imycom> pMyCom;
  18. pMyCom.CoCreateInstance(clsid);
  19. long ret;
  20. ret = pMyCom->Add(1,2);
  21. }
  22. CoUninitialize();
  23. return 0;
  24. }

第二种方法:

  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. }

第三种方法:

  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. }

第四种方法:

  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. }

第五种方法:

  1. int impl4()
  2. {
  3. CoInitialize(NULL);
  4. IMyCom * pMyCom=NULL;
  5. CLSID clsid;
  6. IID iid;
  7. HRESULT hr = CLSIDFromString(OLESTR("{92e83a37-399a-47b1-bf6c-0ab052650cfe}"),&clsid);
  8. if(NOERROR != hr){
  9. MessageBox    (NULL,"ErrCLSIDFromString","ErrCLSIDFromString",MB_OK);
  10. return -1;
  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. if (!SUCCEEDED(::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,iid,(void**)&pMyCom)))
  18. {
  19. DWORD err;
  20. err = GetLastError();
  21. char Msg[128]={0};
  22. sprintf(Msg,"%d",err);
  23. MessageBox(NULL,Msg,"Err",MB_OK);
  24. return -1;
  25. }
  26. long ret;
  27. ret = pMyCom->Add(1,2);
  28. CoUninitialize();
  29. return 0;
  30. }

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