vc++ 操作COM
发布日期:2022-02-26 00:17:38
浏览次数:9
分类:技术文章
本文共 2707 字,大约阅读时间需要 9 分钟。
需求:
1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库#import "组件所在目录myCom.dll" no_namespace
或
#import "类型库所在目录myCom.tlb"
using namespace MYCOM; 方法一:CoInitialize(NULL);
CLSID clsid; CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid); CComPtr<IGetRes> pGetRes;//智能指针 pGetRes.CoCreateInstance(clsid); pGetRes->Hello(); pGetRes.Release();//小心哦!!请看最后的“注意” CoUninitialize(); 方法二: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(); 方法三: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(); 方法四: 直接从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); 方法五: 通过ClassWizard利用类型库生成包装类,不过前提是com组件的接口必须是派 生自IDispatch,具体方法: 调出添加类向导(.NET中),选择类型库中MFC类,打开,选择"文件",选择 "myCom.dll"或"myCom.tlb",接下来会出来该myCom中的所有接口,选择你想 生成的接口包装类后,向导会自动生成相应的.h文件.这样你就可以在你的MFC中 像使用普通类那样使用组件了.(CreateDispatch("myCom.GetRes") 中的参数就是ProgID通过Clsid在注册表中可以查询的到)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中方法,当然具体怎么使用还是在于程序的环境,加以琢磨....转载地址:https://blog.csdn.net/tj_hgxy/article/details/44677441 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年03月30日 00时03分28秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
这还是我认识的“混合云”吗?实际构建竟如此简单?
2019-04-28
敲黑板!信息安全与合规速速提上日程!
2019-04-28
记一次解决业务系统生产环境宕机问题!
2019-04-28
「民工哥技术之路」2019年 6-7 月文章集合
2019-04-28
历史上最著名计算机病毒,似乎都成了我们的回忆
2019-04-28
「民工哥技术之路」2019年 10 月文章集合
2019-04-28
「民工哥技术之路」2019年 8-9 月文章集合
2019-04-28
工具推荐|不用任何软件,如何成为P图大师?
2019-04-28
建议收藏!TCP协议面试灵魂12 问
2019-04-28
Nginx 流控搞不好,背锅跑路少不了!
2019-04-28
SQL 语句单引号、双引号的用法
2019-04-28
介绍 7 款神秘的开源中间件!
2019-04-28
史上最全的 vim 快捷键文档
2019-04-28
Windows 10 现在仍然可以免费下载安装!附教程
2019-04-28
思科前员工删库跑路,损失达 1600 多万
2019-04-28
一行代码简化Python异常信息:错误清晰指出,排版简洁美观 | 开源
2019-04-28
图解 SQL,这也太形象了吧!
2019-04-28
卧槽!华为终于对 JDK 下手了。。
2019-04-28
每天一个 Linux 命令(4):awk
2019-04-28
国人开源了一款小而全的 Java 工具类库,很是牛逼!
2019-04-28