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

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. 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. }
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. 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 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. 一种简单易用的台球瞄准方法——对称瞄准法

    一种简单易用的台球瞄准方法 --对称瞄准法 台球运动是一种大众喜欢的休闲娱乐活动.在各类台球运动中,都需要使用主球把目标球击打进袋,在这个过程中,瞄准是击打进袋的重要一环. 台球瞄准的方法有很多种,比 ...

  2. 怎么给照片降噪?分享两种简单好用的图片降噪方法

    怎么给照片降噪呢?大家在使用数码摄影的时候,相机将光线作为接收信号接收并输出的过程中,会产生图片中粗糙的部分,这本是不该出现的外来像素,导致拍出来的照片或多或少会出现噪点,让图片看起来不美观.这时候我 ...

  3. 一种简单快速有效的低照度图像增强方法

    一种简单快速有效的低照度图像增强方法 一.本文介绍的是一种比较实用并且去阴影效果很好的方法,选自2004年Tao的一篇论文,名称是<An Integrated Neighborhood Depe ...

  4. 一种简单的蒙特卡洛树搜索并行化方法

    监控未观察样本: 一种简单的蒙特卡洛树搜索并行化方法 Watch the Unobserved: a Sample Approach to Parallelizing Monte Carlo Tree ...

  5. 计算机房间墙壁的布置,11种简单且有特色的墙面布置方法

    你有试着自己装点过自己房间的墙面吗?最简单也最快速的装饰方法就是用相片以及海报,但是时间久了就会发现似乎也歇缺乏新意,以下介绍了11种简单且有特色的墙面布置方法,运用的素材从杂志内页到相框.甚至地图都 ...

  6. 来总结一下在VC中调用COM组件的方法

    来总结一下在VC中调用COM组件的方法(大家来补充) [问题点数:50分,结帖人_foo] http://bbs.csdn.net/topics/50319093 发表于: 2004-04-17 16 ...

  7. vue中组件之间调用方法——子组件调用父组件的方法 父组件调用子组件的方法

    vue中组件之间调用方法--子组件调用父组件的方法 & 父组件调用子组件的方法 1.vue中子组件调用父组件的方法 1.1.第一种方法是直接在子组件中通过this.$parent.event来 ...

  8. Vue中父组件调用子组件的方法

    场景 SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图: SpringBoot+Vue+Echarts实现选择时间范围内数据加载显示柱状图_BADAO_LIUMANG_ ...

  9. Angular中父组件通过ViewChild调用子组件的方法

    场景 Angualr中通过原生js和ViewChild的方式获取dom: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10586 ...

最新文章

  1. ASP.NET的一套笔试题
  2. 【下有对策】verycd没有的资源有很多方法下载
  3. vi测试仪维修成功率高吗?_电工电路板检测维修无图电路板的技巧
  4. python IP地址无效化
  5. Java语言描述 猴子吃桃问题(递归和循环写法)
  6. oracle tabs作用,Oracle 中 table 函数的应用浅析
  7. 字符串工具类,随机生成字符串
  8. android中怎么保存checkbox中的checked属性_第二十四天HTML中的form表单
  9. 给你一个亿-电视节目总结
  10. 基于rdf的php编程,RDF 简介
  11. 利用Outlook应用程序接口执行Shellcode
  12. 提取数据_提取图表曲线数据的方法
  13. c++ win10下 遍历文件夹的方式, dirent.h头文件缺失问题
  14. matlab t分布 反函数,Excel 应用TINV函数计算学生的t分布的反函数
  15. 手机ram内存测试软件,RAMTester(内存检测工具)
  16. PTA 发布关于巴基斯坦境内允许的频段和输出功率限制新规
  17. 苹果手机相机九宫格怎么设置_用苹果手机拍照,这3个媲美单反的设置不会用,就别说自己用苹果...
  18. 压缩照片怎么压缩?分享一个好用的方法
  19. C语言——PTA 埃尔米特多项式
  20. apk开发教程!了解Android架构组件后,构建APP超简单!先收藏了

热门文章

  1. CMD各段定义与分配方法指引
  2. 判断是否为二叉排序树的递归算法_左神直通BAT算法笔记(基础篇)
  3. python枪战项目计划书_人肉(共享)代购项目计划书(示例代码)
  4. 微型计算机物理地址转换,微型计算机及接口技术2015年4月真题试题(04732)
  5. vld不输出泄漏信息_光纤天线方案和泄漏电缆方案的比较
  6. 硬核项目 | 用Arduino做一个神奇的悬浮灯!
  7. 19岁「天才少年」自制CPU!1200个晶体管,纯手工打造
  8. 单片机到底是不是嵌入式?
  9. git branch 为什么会进入编辑状态_最好的Git分支管理教程
  10. mysql读取和写入的峰值_计算MySQL的内存峰值公式