https://prismlibrary.com/docs/wpf/converting-from-7.html

Requirement:

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

IGetResEx--方法HelloEx()

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

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

#import "类型库所在目录/myCom.tlb"

using namespace MYCOM;

--Method 1-------------------------------------------------------

CoInitialize(NULL);

CLSID clsid;

CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);

CComPtr<IGetRes> pGetRes;//智能指针

pGetRes.CoCreateInstance(clsid);

pGetRes->Hello();

pGetRes.Release();//小心哦!!请看最后的“注意”

CoUninitialize();

--Method 2---------------------------------------------------------

CoInitialize(NULL);

CLSID clsid;

HRESULT hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);

IGetRes *ptr;

hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,

__uuidof(IGetRes),(LPVOID*)&ptr);

ptr->Hello();

CoUninitialize();

--Method 3--------------------------------------------------------

CoInitialize(NULL);

HRESULT hr;

CLSID clsid;

hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);

IGetRes* ptr;

IGetResEx* ptrEx;

//使用CoCreateClassObject创建一个组件(特别是mutilThreads)的多个对象的

时候,效率更高.

IClassFactory* p_classfactory;

hr=CoGetClassObject(clsid,CLSCTX_INPROC_SERVER,

NULL,IID_IClassFactory,

(LPVOID*)&p_classfactory);

p_classfactory->CreateInstance(NULL,__uuidof(IGetRes),

(LPVOID*)&ptr);

p_classfactory->CreateInstance(NULL,__uuidof(IGetResEx),

(LPVOID*)&ptrEx);

ptr->Hello();

ptrEx->HelloEx();

CoUninitialize();

--Method 4--------------------------------------------------------

直接从dll中得到DllGetClassObject,接着生成类对象及类实例(这方法可以

使组件不用在注册表里注册,这是最原始的方法,但这样做没什么意义,至少失去了COM

对用户的透明性),不推荐使用.

typedef HRESULT (__stdcall * pfnHello)(REFCLSID,REFIID,void**);

pfnHello fnHello= NULL;

HINSTANCE hdllInst = LoadLibrary("组件所在目录/myCom.dll");

fnHello=(pfnHello)GetProcAddress(hdllInst,"DllGetClassObject");

if (fnHello != 0)

{

IClassFactory* pcf = NULL;

HRESULT hr=(fnHello)(CLSID_GetRes,IID_IClassFactory,(void**)&pcf);

if (SUCCEEDED(hr) && (pcf != NULL))

{

IGetRes* pGetRes = NULL;

hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pGetRes);

if (SUCCEEDED(hr)  && (pFoo != NULL))

{

pGetRes->Hello();

pGetRes->Release();

}

pcf->Release();

}

}

FreeLibrary(hdllInst);

--Method 5-------------------------------------------------------

通过ClassWizard利用类型库生成包装类,不过前提是com组件的接口必须是派

生自IDispatch,具体方法:

调出添加类向导(.NET中),选择类型库中MFC类,打开,选择"文件",选择

"myCom.dll"或"myCom.tlb",接下来会出来该myCom中的所有接口,选择你想

生成的接口包装类后,向导会自动生成相应的.h文件.这样你就可以在你的MFC中

像使用普通类那样使用组件了.

CoInitialize(NULL);

CGetRes getRest;

if (getRest.CreateDispatch("myCom.GetRes") != 0)

{

getRest.Hello();

getRest.ReleaseDispatch();

}

CoUninitialize();

--注意--------------------------------------------------------------

COM中的智能指针实际上是重载了->的类,目的是为了简化引用记数,几不需要程序

员显示的调用AddRef()和Release(),但是为什么我们在Method 1中

pGetRes.Release(),问题在与,我们的智能指针pGetRes生命周期的结束是在

CoUninitialize()之后,CoInitialize所开的套间在CoUninitialize()后已经被

关闭,而pGetRes此时发生析构,导致了程序的崩溃,解决这个问题的另一个方法是

CoInitialize(NULL);

CLSID clsid;

CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);

{

CComPtr<IGetRes> pGetRes;//智能指针

pGetRes.CoCreateInstance(clsid);

pGetRes->Hello();

}

CoUninitialize();

--------------------------------------------------------------------

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

————————————————

版权声明:本文为CSDN博主「naive1010」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/naive1010/article/details/183327

COM组件的使用方法的更多相关文章

  1. win10 64位专业版系统中显示32位dcom组件配置的方法

    word.excel是32位的组件,当用户64位系统在运行窗口中输入dcomcnfg命令时,在打开的组件服务管理窗口,是找不到Microsoft Excel.word程序的.另外,Windows 环境 ...

  2. 对 COM+ 组件进行了方法调用,但该组件有一个已被中止的或正在被中止的事务。 (异常来自 HRESULT:0x8004E003)

    错误: 对 COM+ 组件进行了方法调用,但该组件有一个已被中止的或正在被中止的事务. (异常来自 HRESULT:0x8004E003)   解决办法: 程序连接的数据库换到本地.   具体原因没搞 ...

  3. delphi列表视图组件(TListView)使用方法|实例

    TListView 组件以多种形式显示列表的项目,如详细资料.小图标.大图标等形式表示列表中的项目.    列表视图与用TListBox 组件实现的列表框非常相似.不同的是,列表视图可以让用户选择不同 ...

  4. Unity 为自己组件添加公共方法

    为什么需要跟你的组件添加公共方法呢? 留一条后路嘛,万一你那天想起要给全部的组件添加一个方法. 此时我只能告诉你慢慢修改吧累死你 子组件:A ,父组件:B继承方式:  A -> B –> ...

  5. VUE组件间数据方法的传递,初步了解

    父组件的数据传递到子组件: 子组件:(其中fMsg是要从父组件传递过来的数据,注意fMsg要在子组件props里先定义) 父组件:(使用v-bind,将自身数据绑定给中转属性fMsg,从而通过 子组件 ...

  6. vue 和 react 组件间通信方法对比

    vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...

  7. 微信小程序自定义组件的使用以及调用自定义组件中的方法

    在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说 ...

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

    1. 创建工程 ng new demo3 2. 创建子组件 ng g component child 3. 在子组件中定义方法greeting 4. 父组件html(第三行是模板中调用子组件的方法) ...

  9. reactjs--父组件调用子组件的内部方法(转载)

    reactjs--父组件调用子组件的内部方法 发表于2016/10/11 9:21:37  965人阅读 1.引入相关js <script src="js/react.js" ...

  10. vue 组件名和方法名 重名了,报function错误

    vue 组件名和方法名 重名了,报function错误

随机推荐

  1. 6.Java方法

    一.什么是方法 方法:要去做某件事情,而采取的一些解决办法( Java 中的方法是完成某些事情的) System.out.println(); //类(系统类) 对象(标准输出对象) 方法(print ...

  2. ASP.NET保存图片到sql2008

    //将图片转行为二进制的方式,存储到数据库 string name = FileUpload1.PostedFile.FileName; string type = name.Substring(na ...

  3. java课堂动手动脑及课后实验总结

      动手动脑一:枚举   输出结果: false false true SMALL MEDIUM LARGE 分析和总结用法 枚举类型的使用是借助ENUM这样一个类,这个类是JAVA枚举类型的公共基本 ...

  4. Java基础00-面向对象基础13

    1. 类和对象 1.1 什么是对象 1.2 什么是面向对象                1.3 什么是类 1.4 什么是对象的属性 1.5 什么是对象的行为 行为就是对象能够干什么 1.6 类和对象 ...

  5. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

  6. 备战- Java虚拟机

    备战- Java虚拟机 试问岭南应不好,却道,此心安处是吾乡. 简介:备战- Java虚拟机 一.运行时数据区域 程序计算器.Java 虚拟机栈.本地方法栈.堆.方法区 在Java 运行环境参考链接: ...

  7. 在Rancher中修改K8S服务参数的万金油法则

    作者简介 王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营.拥有7年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Lin ...

  8. 手写一个超简单的Vue

    基本结构 这里我根据自己的理解模仿了Vue的单文件写法,通过给Vue.createApp传入参数再挂载元素来实现页面与数据的互动. 其中理解不免有错,希望大佬轻喷. 收集数据 这里将Vue.creat ...

  9. 7.27考试总结(NOIP模拟25)[random·string·queue]

    死亡的尽头,没有神 T1 random 解题思路 这波是找规律完胜了.. lby dalao根据样例找出了正确的式子:\(\dfrac{n^2-1}{9}\) 然而,我这个菜鸡却推出了这样一个错误的式 ...

  10. Typora PicGo Gitee博客写作好搭档

    利用Gitee仓库存放图片 1.首先在Gitee上创建一个公开的仓库,我这里创建了一个名叫resources的仓库: 2.在Gitee中获取私人令牌(个人设置界面中): 安装配置PicGo 1.下载自 ...