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();
}

C++ Com控件调用的更多相关文章

  1. 用delphi的THTTPRIO控件调用了c#写的webservice。

    用delphi的THTTPRIO控件调用了c#写的webservice. 下面是我调试时遇到的一些问题: 1,导入wsdl文件:file--new----other----wenservice---W ...

  2. 关于Winform控件调用插入点(光标)的用法

    我们自定义控件中可能会有一些光标的使用,比如插入文字和图片提示,下面是调用WIN32 API的光标用法 Winform控件调用插入点的用法 // 导入处理光标的 Windows 32 位 API // ...

  3. 问题-PopupMenu是哪个控件调用弹出的?

    相关资料: http://bbs.csdn.net/topics/310195683 问题现象:今天有朋友问我个简单的问题,在多个Edit上弹出菜单,怎么判断是哪个Edit调用的.我想了想这个我还真不 ...

  4. 开发ActiveX控件调用另一个ActiveX系列3——ActiveX调用另一个ActiveX

    终于进入正题了,怎样在ActiveX中调用另一个ActiveX.我们的项目需要调用华视电子身份证识别仪的ActiveX控件 在这里有很多识别仪ActiveX插件下载:http://www.idukaq ...

  5. 开发ActiveX控件调用另一个ActiveX系列2——调试ActiveX

    关于调试ActiveX控件,有若干方法,例如可以建一个MFC工程调用调试,我则倾向于使用附加到浏览器进程,因为浏览器才是真正运行的环境. 打开加载ActiveX的目标页面,当然希望我们的调试内容不是自 ...

  6. 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题

    程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人可以直接跳过. 为什么要开发ActiveX控件 由于工作需要,我们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件 ...

  7. .NET混合开发解决方案10 WebView2控件调用网页JS方法

    系列目录     [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...

  8. android include中的控件调用

    项目中经常会有一些布局是重用的,但是如何来更好的利用这些布局中的控件 转: http://zhidao.baidu.com/link?url=GU93U8Wu31dfp7mKEx52hMJkxjFLC ...

  9. 【winform程序】自定义webrowser控件调用IE的版本

    修改注册表: bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROW ...

  10. Js或 Activex 控件调用打印预览等操作

    <input value="打印" type="button" onclick="javascript:window.print()" ...

随机推荐

  1. linux中,当执行rpm -e删除一个软件包时,都做了些什么事

    问题描述: 今天在通过rpm进行删除软件包时,出现了问题,就引发了我对于rpm包执行删除动作时的一些行为做了思考,之前找了很多的文章,后来想如果有debug日志信息,那么不就都清楚了吗 通过打印rpm ...

  2. Mysql推荐使用规范(转)

    一:基础规范 1.使用InnoDB存储引擎 支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 2.推荐使用utf8mb4字符集 无需转码,无乱码风险, 支持emoji表情以及部 ...

  3. JavaCC从入门到出门

    一.JavaCC JavaCC是java的compiler compiler.JavaCC是LL解析器生成器,可处理的语法范围比较狭窄,但支持无限长的token超前扫描. 安装过程: 我是从githu ...

  4. Golang 笔记 1 基础、基本数据类型

    一.Go语言基础 1. 基础 Go语言中的标识符必须以字母(Unicode字母,PHP/JS可以用中文作为变量名)下划线开头.大写字母跟小写字母是不同的:Hello和hello是两个不同的名字.  G ...

  5. 关闭win10一切

    狂客原创,转载请注明来源 关闭更新 注册表(以管理员身份运行) 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\     Start值 ...

  6. thymeleaf(二)

    项目demo     http://pan.baidu.com/s/1wg6PC 学习资料网址  http://www.blogjava.net/bjwulin/archive/2013/02/07/ ...

  7. oracle 28000错误解决方法

    ORA-28000: the account is locked-的解决办法 ORA-28000: the account is locked 第一步:使用PL/SQL,登录名为system,数据库名 ...

  8. win 10安装Linux虚拟机教程

    1.首先下载虚拟机 用的是VMware 官方下载地址:https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmwar ...

  9. 使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题

    阿里云服务器有时会出现短暂的连接不上数据库服务器(RDS)的问题,之前由于没有启用 Entity Framework Core 的失败重试功能(默认是禁用的),短暂的连接失败立马会引发下面的异常从而出 ...

  10. jq1.9.0以上版本不兼容live()解决方法

    最近一个项目里用bootstrap做图形渲染,需要用到jq1.9以上版本,而copy的js代码里用到了live()方法,故两者产生了兼容问题,下面是解决方案: $('#my').on("cl ...