`

vc中调用Com组件的方法详解

 
阅读更多

需求:
1.
创建myCom.dll,COM只有一个组件,两个接口:
   IGetRes--
方法Hello(),
   IGetResEx--
方法HelloEx()

2.
在工程中导入组件或类型库

clip_image001 #import "组件所在目录myCom.dll" no_namespace

clip_image001   #import "类型库所在目录myCom.tlb"
clip_image001   
using namespace MYCOM;



方法一:

clip_image001   CoInitialize(NULL);
clip_image001   CLSID clsid;
clip_image001   CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
clip_image001   CComPtr<IGetRes> pGetRes;//
智能指针
clip_image001
   pGetRes.CoCreateInstance(clsid);
clip_image001   pGetRes->Hello();
clip_image001   pGetRes.Release();
//小心哦!!请看最后的注意
clip_image001
   CoUninitialize();


方法二:

clip_image001   CoInitialize(NULL);
clip_image001   CLSID clsid;
clip_image001   HRESULT hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
clip_image001   IGetRes *ptr;
clip_image001   hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
clip_image001                 __uuidof(IGetRes),(LPVOID*)&ptr);
clip_image001   ptr->Hello();
clip_image001   CoUninitialize();


方法三:

clip_image001CoInitialize(NULL);
clip_image001   HRESULT hr;
clip_image001   CLSID clsid;
clip_image001   hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
clip_image001   IGetRes* ptr;
clip_image001   IGetResEx* ptrEx;
clip_image001   //
使用CoCreateClassObject创建一个组件(特别是mutilThreads)的多个对象的
clip_image001
     时候,效率更高.
clip_image001   IClassFactory* p_classfactory;
clip_image001   hr=CoGetClassObject(clsid,CLSCTX_INPROC_SERVER,
clip_image001                       NULL,IID_IClassFactory, 
clip_image001                       (LPVOID*)&p_classfactory);
clip_image001   p_classfactory->CreateInstance(NULL,__uuidof(IGetRes),
clip_image001                                          (LPVOID*)&ptr);
clip_image001   p_classfactory->CreateInstance(NULL,__uuidof(IGetResEx),
clip_image001                                          (LPVOID*)&ptrEx);
clip_image001   ptr->Hello();
clip_image001   ptrEx->HelloEx();
clip_image001   CoUninitialize();
clip_image001


方法四:
直接从dll中得到DllGetClassObject,接着生成类对象及类实例(这方法可以
使组件不用在注册表里注册,这是最原始的方法,但这样做没什么意义,至少失去了COM
对用户的透明性),不推荐使用.

clip_image001typedef HRESULT (__stdcall * pfnHello)(REFCLSID,REFIID,void**);
clip_image001   pfnHello fnHello= NULL;
clip_image001   HINSTANCE hdllInst = LoadLibrary("
组件所在目录myCom.dll");
clip_image001   fnHello=(pfnHello)GetProcAddress(hdllInst,"DllGetClassObject");
clip_image001   
if (fnHello != 0)
clip_image002clip_image003   
{
clip_image005   IClassFactory* pcf = NULL;
clip_image005   HRESULT hr=(fnHello)(CLSID_GetRes,IID_IClassFactory,(
void**)&pcf);
clip_image005   
if (SUCCEEDED(hr) && (pcf != NULL))
clip_image006clip_image007   
{
clip_image005   IGetRes* pGetRes = NULL;
clip_image005   hr = pcf->CreateInstance(NULL, IID_IFoo, (
void**)&pGetRes);
clip_image005   
if (SUCCEEDED(hr)   && (pFoo != NULL))
clip_image006clip_image007   
{
clip_image005   pGetRes->Hello();
clip_image005   pGetRes->Release();
clip_image008   }
clip_image005   pcf->Release();
clip_image008   }
clip_image009   } 
clip_image001   FreeLibrary(hdllInst);
clip_image001


方法五:
通过ClassWizard利用类型库生成包装类,不过前提是com组件的接口必须是派
生自IDispatch,具体方法:
    
调出添加类向导(.NET),选择类型库中MFC类,打开,选择"文件",选择
"myCom.dll"
"myCom.tlb",接下来会出来该myCom中的所有接口,选择你想
生成的接口包装类后,向导会自动生成相应的.h文件.这样你就可以在你的MFC
像使用普通类那样使用组件了.CreateDispatch("myCom.GetRes") 中的参数就是ProgID通过Clsid在注册表中可以查询的到)

clip_image001CoInitialize(NULL);
clip_image001   CGetRes getRest;
clip_image001   if (getRest.CreateDispatch("myCom.GetRes") != 0)
clip_image002clip_image003   {
clip_image005   getRest.Hello();
clip_image005   getRest.ReleaseDispatch();
clip_image009   }
clip_image001   CoUninitialize();
clip_image001



注意:
COM中的智能指针实际上是重载了->的类,目的是为了简化引用记数,几不需要程序
员显示的调用AddRef()Release(),但是为什么我们在Method 1
pGetRes.Release(),
问题在与,我们的智能指针pGetRes生命周期的结束是在
CoUninitialize()
之后,CoInitialize所开的套间在CoUninitialize()后已经被
关闭,pGetRes此时发生析构,导致了程序的崩溃,解决这个问题的另一个方法是

clip_image001CoInitialize(NULL);
clip_image001   CLSID clsid;
clip_image001   CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
clip_image002clip_image003   {
clip_image005   CComPtr<IGetRes> pGetRes;//
智能指针
clip_image005
   pGetRes.CoCreateInstance(clsid);
clip_image005   pGetRes->Hello();
clip_image009   }
clip_image001   CoUninitialize();
clip_image001


以上就是COM5中方法,当然具体怎么使用还是在于程序的环境,加以琢磨....

分享到:
评论

相关推荐

    VC6.0调用MATLAB生成的COM组件

    - 调用组件中的方法,例如读取数据、执行计算等。 3. **示例代码**: - 下面是一个简单的示例,展示如何在VC6.0中创建并调用一个名为`plotsin`的COM组件: ```cpp #include #import "..\...

    vc调用matlab 的com组件

    本教程主要介绍了如何在VC++中调用MATLAB R2009a的COM组件,以及在没有安装MATLAB的计算机上运行这些组件的方法。 1. **配置MATLAB C/C++编译器** 在MATLAB的命令窗口中,通过输入`mbuild -setup`来选择和配置...

    VC6.0调用MATLAB生成的COM组件[收集].pdf

    ### VC6.0调用MATLAB生成的COM组件详解 #### 一、前言与环境配置 本文将详细介绍如何在VC6.0中调用MATLAB生成的COM组件。此方法适用于希望在C++应用程序中复用MATLAB算法的情况。作者彭千贺在其文档中详细记录了...

    VC++6.0调用银海软件医保接口备忘录

    八、附录:VC中调用COM组件的方法详解 在VC中调用COM组件有多种方法,本文档介绍了三种方法: 1. 使用#import指令导入类型库 使用#import指令可以导入类型库,然后使用using namespace语句可以使用COM组件。 2. ...

    VC6.0调用MATLAB生成的COM组件收集.pdf

    ### VC6.0调用MATLAB生成的COM组件知识点总结 #### 一、在MATLAB中安装mbuild **背景介绍:** 对于需要在不同环境中部署MATLAB算法的应用开发者而言,将MATLAB代码封装为COM组件是一种常见的做法。这不仅能够使...

    COM组件(详细讲解)

    COM组件的详解集合。 包括:VC6.0 创建COM组件,.NET(C#)创建的COM组件,ATL编写COM组件 使用VB6.0调用, 使用VC6.0调用, 使用.Net(VB)调用, 使用.Net(C#)调用, COM和DLL的区别。 您一定可以通过它学会COM...

    基于COM的VC调用Matlab的方法及实现.pdf

    ### 知识点详解 ...综上所述,基于COM的VC调用Matlab方法在工程仿真和软件开发中具有重要的应用价值,通过不同的集成方法可以解决工程开发中遇到的性能和功能上的挑战,实现高效的混合编程解决方案。

    BCB调用VC的DLL

    本篇文章将详细介绍如何在BCB环境中调用由VC编译生成的DLL(动态链接库),以及在这一过程中可能遇到的问题及解决方法。 #### 描述:BCB调用VC的DLL 当开发者需要利用BCB进行程序开发时,可能会面临需要调用由VC...

    VC6.0和VC2012中调用WebBrowser简单的实现过程(图解过程).docx

    在VC6.0和VC2012中,调用WebBrowser控件的基本步骤相似,主要涉及新建MFC工程、添加WebBrowser控件、定义对象变量和编写导航代码。尽管这两个版本的IDE界面和操作略有不同,但核心概念是一致的。WebBrowser控件使得...

    vc.rar_COM_COM VC_DCOM_DCOM组件_vc dcom

    在DCOM中,组件可以透明地在不同网络位置的计算机上运行,对于调用者来说,就像是组件就在本地一样。DCOM通过身份验证、安全性机制以及网络透明的远程过程调用来实现这一目标。DCOM还引入了激活上下文的概念,允许...

    详细讲解基于COM组件的VC和MATLAB混合编程

    ### 基于COM组件的VC和MATLAB混合编程详解 #### 一、MATLAB下构建COM组件 在实现基于COM组件的VC和MATLAB混合编程之前,首先需要在MATLAB环境中创建相应的COM组件。这一过程主要涉及将MATLAB中的算法封装为可以被...

    VC6使用COM库的三种方法

    ### VC6中使用COM库的三种方法详解 #### 一、使用COM库函数 在Visual C++ 6.0(简称VC6)中使用COM库的第一种方法是直接使用COM库函数。这种方法需要程序员手动处理COM组件的生命周期管理,包括初始化、创建组件...

    MAtlab7.1与VC++6.0 混合编程,MATLAB中dll制作-VC6中调用,非常好

    《MATLAB7.1与VC++6.0混合编程及MATLAB中DLL制作-VC6中调用详解》 在软件开发中,有时我们需要结合不同的编程环境和工具以实现更复杂的计算任务。MATLAB作为强大的数值计算和数据分析平台,与传统的C++编译器如VC++...

    vc 与matlab联合编程

    通过邓科的详细介绍,我们可以看到,利用COM接口在VC中调用MATLAB组件是一种高效且灵活的方式,尤其适用于大型项目或者需要高度定制化功能的场景。与MATCOM相比,COM接口几乎不受MATLAB函数限制,但同时也需要开发者...

    VC图形开发组件xImage

    **VC图形开发组件xImage详解** 在Windows编程中,尤其是使用Visual C++(简称VC)进行应用程序开发时,处理图像文件是一项重要的任务。xImage是一个专门针对VC图形开发的组件,它提供了对常见图像文件格式如Bmp、...

    COM组件详细讲解

    COM组件的详解集合。 包括:VC6.0 创建COM组件,.NET(C#)创建的COM组件,ATL编写COM组件 使用VB6.0调用, 使用VC6.0调用, 使用.Net(VB)调用, 使用.Net(C#)调用, COM和DLL的区别。 好不好大家说的算。

    matlab com组件应用

    MATLAB COM组件应用详解 MATLAB(Matrix Laboratory)是由MathWorks公司开发的一种强大的数学计算软件,广泛应用于工程计算、数据分析、算法开发、图形绘制等多个领域。MATLAB COM(Component Object Model)组件是...

Global site tag (gtag.js) - Google Analytics