EDN China 电子设计技术互动社区>博客 >HotPower博客 >VC中调用COM组件的方法(转帖)
个人档案
呢称:HotPower     文章(1284)     访问(3207903)     评论(656)     投票(66)     订阅本博  RSS
介绍: 欢迎参加新唐Cortex-M0巡回研讨会
全部博文:
2012年  -   4月 3月 2月
2011年  -   12月 11月 10月 9月 8月 7月 6月 5月 4月 3月 2月 1月
2010年  -   12月 9月 8月 7月 6月 5月
查看全部博文
              博客首页

VC中调用COM组件的方法(转帖)  [软件开发] 发布时间:2008-05-29 03:27: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();
 


 

标签:  
有[ 0 ]名读者喜欢此文     
阅读(3615)   评论(0)   [最后更新:2008-05-29 03:27:25]
收藏  I   打印  I   推荐到我的小组  I   转发到我的博客 (0)
对不起,您还没有登录,请先登录注册


有 [ 0 ] 名读者发表评论 - VC中调用COM组件的方法(转帖)
 
我来评论 - VC中调用COM组件的方法(转帖)
您的昵称: 美国的游客        (您将以游客身份发表,请登录 |  注册)
您的评论:
 
你还可以输入1000
验证码:
   
转发到我的博客
评论 @HotPower的文潭 的“VC中调用COM组件的方法(转帖)”
准备及条件:COM服务器为进程内服务器,DLL名为simpCOM.dll,该组件只有一个接口IFoo,该接口只有一个方法HRESULTSayHello(void)在SDK中调用=====================================一、最简单最常用的一种,用#import导入类型库,利用VC提供的智能指针包装类演示代码:#import"D:\Temp\vc\simpCOM\Deb
你还可以输入20000
同时评论给 HotPower
    
快速回复
 
你还可以输入1000
    
引用回复
引用评论 
 
你还可以输入1000
    
最新评论
热门标签

EDN官方QQ群   更多QQ群
  • EDN-深圳 8366025
  •  NEW!
  • 菜农Cortex-M0技术交流 12047788
  • EDN-哈尔滨 75642591
  • EDN-上海 15156661
  • EDN-广州 57660943
  • EDN-桂林 48813559
  • EDN-武汉 25150805
  • EDN-模拟电路 2837145
  • EDN-通讯 30548292
  • EDN-综合 57490949

促进EDN网友交流合作,方便EDN网友学习沟通

2012 EDN China -- Use of this website is subject to its terms of use.
经营许可编号:京公安备110102000546 京ICP备09028740号-20