来总结一下在VC中调用COM组件的方法(大家来补充) [问题点数:50分,结帖人_foo]

http://bbs.csdn.net/topics/50319093
发表于: 2004-04-17 16:57:25
准备及条件:
COM服务器为进程内服务器,DLL名为simpCOM.dll,该组件只有一个接口IFoo,该接口只有一个方法HRESULT SayHello(void)

在SDK中调用
=====================================
一、最简单最常用的一种,用#import导入类型库,利用VC提供的智能指针包装类
演示代码:

#import "D:\Temp\vc\simpCOM\Debug\simpCOM.dll" no_namespace
CoInitialize(NULL);

IFooPtr spFoo = NULL;
spFoo.CreateInstance(__uuidof(Foo));
spFoo->SayHello();
spFoo.Release();/*晕死了,本来智能指针就是为了让用户不用关心这个的,可是我发现如果不手工调用一下的话,程序退出后会发生内存访问错误,我是在console中做试验的,哪位大侠知道怎么回事请一定指教*/
CoUninitialize();

二、引入midl.exe产生的*.h,*_i.c文件,利用CoCreateInstance函数来调用

演示代码:
/*在工程中加入*_i.c文件,例如本例的simpCOM_i.c,该文件定义了类和接口的guid值,如果不引入的话,会发生连接错误。*/

#include "D:\Temp\vc\simpCOM\simpCOM.h"
CoInitialize(NULL);

IFoo* pFoo = NULL;
HRESULT hr = CoCreateInstance(CLSID_Foo, NULL, CLSCTX_ALL, IID_IFoo, (void**)&pFoo);
if (SUCCEEDED(hr) && (pFoo != NULL))
{
pFoo->SayHello();
pFoo->Release();
}

CoUninitialize();

三、不用CoCreateInstance,直接用CoGetClassObejct得到类厂对象接口,然后用该接口的方法CreateInstance来生成实例。
演示代码:
/*前期准备如二方法所述*/
IClassFactory* pcf = NULL;
HRESULT hr = CoGetClassObject(CLSID_Foo, CLSCTX_ALL, NULL, IID_IClassFactory, (void**)&pcf);
if (SUCCEEDED(hr) && (pcf != NULL))
{
IFoo* pFoo = NULL;
hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pFoo);
if (SUCCEEDED(hr)  && (pFoo != NULL))
{
pFoo->SayHello();
pFoo->Release();
}
pcf->Release();
}

四、不用CoCreateInstance or CoGetClassObject,直接从dll中得到DllGetClassObject,接着生成类对象及类实例(本方法适合于你想用某个组件,却不想在注册表中注册该组件)

演示代码:
/*前期准备工作如二方法所述,事实上只要得到CLSID和IID的定义及接口的定义就行*/

typedef HRESULT (__stdcall * pfnGCO) (REFCLSID, REFIID, void**);
pfnGCO fnGCO = NULL;
HINSTANCE hdllInst = LoadLibrary("D:\\Temp\\vc\\simpCOM\\Debug\\simpCOM.dll");
fnGCO = (pfnGCO)GetProcAddress(hdllInst, "DllGetClassObject");
if (fnGCO != 0)
{
IClassFactory* pcf = NULL;
HRESULT hr=(fnGCO)(CLSID_Foo, IID_IClassFactory, (void**)&pcf);
if (SUCCEEDED(hr) && (pcf != NULL))
{
IFoo* pFoo = NULL;
hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pFoo);
if (SUCCEEDED(hr)  && (pFoo != NULL))
{
pFoo->SayHello();
pFoo->Release();
}
pcf->Release();
}
}
FreeLibrary(hdllInst);

在MFC中调用
=====================================
在MFC中除了上面的几种方法外,还有一种更方便的方法,就是通过ClassWizard利用类型库生成包装类,不过有个前提就是com组件的接口必须是派生自IDispatch

具体方法:
1、按Ctrl+W调出类向导,按Add Class按钮弹出新菜单,选From a type libarary,然后定位到simpCOM.dll,接下来会出来该simpCOM中的所有接口,选择你想生成的接口包装类后,向导会自动生成相应的.cpp和.h文件.
这样你就可以在你的MFC工程中像使用普通类那样使用COM组件了.

演示代码:

CoInitialize(NULL);

IFoo foo;
if (foo.CreateDispatch("simpCOM.Foo") != 0)
{
foo.SayHello();
foo.ReleaseDispatch();
}

CoUninitialize();

来总结一下在VC中调用COM组件的方法相关推荐

  1. vue 父组件中调用子组件的方法

    Vue项目中如何在父组件中直接调用子组件的方法: 方案一:通过ref直接调用子组件的方法: //父组件中<template><div><Button @click=&qu ...

  2. vue父组件中调用子组件的方法

    (1)通过ref直接调用子组件的方法 //父组件中<template><div><Button @click="handleClick">点击调 ...

  3. c++中调用Com组件的方法详解

     转载自:http://www.cppblog.com/woaidongmao/archive/2011/01/10/138250.html 需求: 1.创建myCom.dll,该COM只有一个组 ...

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

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

  5. vue怎么调用子元素的方法_vue 父组件中调用子组件函数的方法

    vue 父组件中调用子组件函数的方法 在父组件中调用子组件的方法: 1.给子组件定义一个ref属性.eg:ref="childItem" 2.在子组件的methods中声明一个函数 ...

  6. C++程序中调用其他exe可执行文件方法

    在编程过程中有个需求,点击某个按钮需要弹出系统的声音控制面板.在网上查了下代码中调用其他exe程序或者打开其他文件的方法. 自己借鉴网上的文章稍微总结下,加深下印象,也给方便自己用. 在代码中调用其他 ...

  7. C/C++ VS中调用matlab函数的方法

    C/C++ VS中调用matlab函数的方法 [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/73743654 Matla ...

  8. 在c#中调用windows脚本的方法

    在c#中调用windows脚本的方法 方法1:直接调用   CODE:   System.Diagnostics.Process proc = new System.Diagnostics.Proce ...

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

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

最新文章

  1. [JS]在ACM模式下获取输入
  2. Linux系统的大小端模式
  3. GitHub代码一键转VS Code:只需+1s
  4. android缓存之Lrucache 和LinkedHashMap
  5. 工作2年,月薪2万,我还是选择了离职
  6. 《系统集成项目管理工程师》必背100个知识点-21监控项目工作ITTO
  7. Java第三章 类和对象3.1+3.2
  8. “有一个产品经理的女朋友是什么体验?”
  9. [网络安全自学篇] 九十.远控木马详解及APT攻击中的远控和防御
  10. JMS学习四(ActiveMQ消息过滤)
  11. 【生物】基因编辑研究方向全面盘点,一文带你了解基因魔剪的前世今生
  12. TCP/IP 网络协议
  13. php 5.4 mysql 5.7_致命错误:在将PHP 5.4.22和MySQL 5.5与Apache 2.4.7连接时调用未定义的函数mysqli_connect()...
  14. Oracle数据库REDO损坏ora-00333修复手札
  15. 【转】卡巴斯基2011导入key专用工具+卡巴斯基提取key工具(激活码转换key)
  16. 2022华为软挑成功退赛奖
  17. php调用winhttp,HTTP HTTPS POST GET(包含curl版本和winhttp两种实现)
  18. AE光效效果插件:Trapcode Shine
  19. A股上市公司MSCI指数和ESG评级效果(2010-2021年)
  20. 实验吧唯快不破writeup

热门文章

  1. hibernate继承关系映射方法(三)--每个具体类一张表TPC
  2. ECMAScript6入门教程(一)
  3. Oracle簇表介绍 (clustered table)
  4. 一文了解HCIA考试相关问题
  5. php 根据数组归类,PHP如何高效地对根据键值对数组元素进行归类?
  6. 数字原生,创新生长|企业如何打造数字创新的“飞天梦”?
  7. 深度 | 容器规模化落地企业的最佳途径
  8. SpringCloud 应用在 Kubernetes 上的最佳实践 —— 开发篇
  9. ios编译与android编译区别是什么,为iOS和Android编译C ++代码(XCode)。 这是真的吗?...
  10. c语言变量名必须用小写 常量用大写,day02 -C语言 常量 变量 数据类型 进制转换 数据溢出...