原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449

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

准备及条件:

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. vc中调用Com组件的方法详解

    vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGet ...

  2. vc 中调用COM组件的方法

    需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库  #im ...

  3. vue组件之间的通信以及如何在父组件中调用子组件的方法和属性

    在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> < ...

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

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

  5. vc中调用Com组件的所有方法详解

    首先,对于Com组件的入门学习,可以看一下<Windows程序设计技术基础——MFC与.NET> 任哲编著的21世纪重点大学规划教材那本书,适合入门(虽然不一定会使用),了解些基础原理. ...

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

    原文地址 文章目录 什么是组件? 使用组件 组件 什么是组件? 组件 (Component) 是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自 ...

  7. 在javascript中使用com组件的方法

    转载自:  http://dhailin.blog.163.com/blog/static/230738322011128102043880/ 首先创建一个COM组件,插入一个双接口Itest,在此接 ...

  8. 在JS中使用COM组件的方法

    首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数 { // TODO: 在此添加实现代码 ...

  9. vue 父组件中调用子组件函数

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

随机推荐

  1. [Javascript] Promise-based functions should not throw exceptions

    Source You can also start a chain of then() method calls via Promise.resolve() and execute the synch ...

  2. iOS开发——多线程OC篇&(十)多线程NSOperation基本使用

    NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最⼤大并发数的 ...

  3. js获取非行间样式/定义样式

    <!--DOCTYPE html--> <html> <head> <meta charset="utf-8" /> <sty ...

  4. 淘宝 印风 UDF

    http://blog.csdn.net/zhaiwx1987/article/details/6902623

  5. shell 编程中使用到得if语句内判断参数

    http://blog.chinaunix.net/uid/21411227/cid-63616-list-1.html 1.判断文件类型   –b 当file存在并且是块文件时返回真 -c 当fil ...

  6. QT核心编程之调试技术 (g)

    Qt应用程序的调试可以通过DDD进行跟踪调试和打印各种调试或警告信息.DDD(Data Display Debugger)是使用gdb调试工具的图形工具,它安装在Linux操作系统中,使用方法可参考D ...

  7. docker 容器数据管理

    给容器添加一个数据卷 sudo docker run -d -P --name web -v /webapp training/webapp python app.py 可以在Dockerfile中使 ...

  8. WinServer 之 访问同网段服务器 或 同一服务器多虚拟机间的访问

    今天在发布网站时遇到不能访问同网段数据库服务器.具体情况为:web服务端部署在192.168.10.1下,而数据库服务端部署在192.168.10.2下,数据库连接直接配置为192.168.10.2会 ...

  9. java发送邮件 实现编辑html代码

    这个例子相当的简单,一看就懂(  此例仅支持163发送163及qq邮箱) 首先要导入两个必须jar包:mail-1.4.4.jar 和 commons-email-1.2.jar这两个jar包是我用的 ...

  10. UIScrollView做循环图片

    #import "ViewController.h" #define IMAGE_COUNT 6 @interface ViewController () { UIImageVie ...