VC调用COM组件的几种方法
来源:互联网 发布:淘宝消费排名查询系统 编辑:程序博客网 时间:2024/05/09 16:50
这篇的内容也是我在使用COM组件的时候遇到困难后在网上找的一些调用的方法,以备后用。
1.首先创建一个COM组件:myCom.ocx
组件里面有一个普通接口:ImyCom 一个方法为:Hello();
事件接口:ImyComEVT 一个事件为:HelloEvt();
2.在需要调用myCom组件的工程中导入组件
在最开始处:
#import "组件所在目录myCom.dll" no_namespace
方法一:
CoInitialize(NULL); CLSID clsid; CLSIDFromProgID(OLESTR("myCom.ImyCom"),&clsid); CComPtr<ImyCom> pICom;// 智能指针 pICom.CoCreateInstance(clsid); pICom->Hello(); pICom.Release();// 注意CoUninitialize();
方法二:
CoInitialize(NULL); CLSID clsid; HRESULT hr=CLSIDFromProgID(OLESTR("myCom.ImyCom"),&clsid); ImyCom *ptr; hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER, __uuidof(ImyCom),(LPVOID*)&ptr); ptr->Hello();CoUninitialize();
方法三:
CoInitialize(NULL); HRESULT hr; CLSID clsid; hr=CLSIDFromProgID(OLESTR("myCom.ImyCom"),&clsid); ImyCom* ptr; ImyComEvt* ptrE; //使用CoCreateClassObject创建一个组件(特别是mutilThreads)的多个对象的 时候,效率更高. IClassFactory* p_classfactory; hr=CoGetClassObject(clsid,CLSCTX_INPROC_SERVER, NULL,IID_IClassFactory, (LPVOID*)&p_classfactory); p_classfactory->CreateInstance(NULL,__uuidof(ImyCom), (LPVOID*)&ptr); p_classfactory->CreateInstance(NULL,__uuidof(ImyComEvt), (LPVOID*)&ptrEx); ptr->Hello(); ptrE->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)) { ImyCom* pCom = NULL; hr = pcf->CreateInstance(NULL, IID_IFoo, (void**)&pCom); if (SUCCEEDED(hr) && (pFoo != NULL)) { pCom->Hello(); pCom->Release(); } pcf->Release(); } } FreeLibrary(hdllInst);
方法五:
通过ClassWizard利用类型库生成包装类,不过前提是com组件的接口必须是派生自IDispatch,具体方法: 调出添加类向导(.NET中),选择类型库中MFC类,打开,选择"文件",选择"myCom.dll"或"myCom.tlb",接下来会出来该myCom中的所有接口,选择你想生成的接口包装类后,向导会自动生成相应的.h文件.这样你就可以在你的MFC中像使用普通类那样使用组件了.(CreateDispatch("myCom.ImyCom") 中的参数就是ProgID通过Clsid在注册表中可以查询的到)CoInitialize(NULL); ImyCom ICom; if (ICom.CreateDispatch("myCom.ImyCom") != 0) { ICom.Hello(); ICom.ReleaseDispatch(); }CoUninitialize();注意:COM中的智能指针实际上是重载了->的类,目的是为了简化引用记数,几不需要程序员显示的调用AddRef()和Release(),但是为什么我们在方法 1中pCom.Release(),问题在与,我们的智能指针pCom生命周期的结束是在CoUninitialize()之后,CoInitialize所开的套间在CoUninitialize()后已经被关闭,而pCom此时发生析构,导致了程序的崩溃,解决这个问题的另一个方法是CoInitialize(NULL); CLSID clsid; CLSIDFromProgID(OLESTR("myCom.ImyCom"),&clsid); { CComPtr<ImyCom> pCom;//智能指针 pCom.CoCreateInstance(clsid); pCom->Hello(); }CoUninitialize();
结语:在WIN32程序里面推荐使用方法二,在MFC程序中推荐使用方法五或者方法二。
以上是我的理解,如果有更好的方法或者以上有错误的地方请在留言中指出!~~~
0 0
- VC调用COM组件的几种方法
- VC中COM组件的几种调用方式
- VC调用COM组件的几种方式
- 组件的几种方法VC中使用COM
- VC中调用COM组件的方法
- VC中调用Com组件的方法
- vc中调用Com组件的方法
- VC中调用COM组件的方法
- VC中调用COM组件的方法
- vc中调用Com组件的五种方法详解
- 总结一下在VC中调用COM组件的方法+++VC调用远程COM+组件
- VC中调用COM组件几种方式
- 在VC中调用COM组件的方法
- 在VC中调用COM组件的方法(转载)
- 在VC中调用COM组件的方法
- VC中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- vc中调用Com组件的方法详解
- Epoll工作模式详解
- CENTOS 6.5安装FREESWITCH 1.5小记
- 使用mysql workbench将excel远程导入到mysql数据库
- 《自然》年度十大人物之三
- freescale Android Camera 调试总结
- VC调用COM组件的几种方法
- 关于VC编译错误fatal error C1083的解决办法
- 第八章 拦截器机制——《跟我学Shiro》
- win8及win8.1系统的系统评估分数
- 一碗潮汕白糜,后宫佳丽三千
- string 与char* char[]之间的转换
- Java 8 官方教程翻译——方法引用(method reference)
- Virtual应用在析构函数和构造函数调用中
- css定位那点事 为指定div添加绝对定位