如何调用第三方的COM组件?需要知道哪些信息?

tieren428 2017-03-01 10:22:19
接触COM组件不久,按照网上教程用ATL模板弄了个COM组件,创建了类,添加了方法并注册。然后用MFC写了可执行程序调用COM组件接口的方法(函数),跑通没问题。
项目的要求是我要做一个通用的检测软件,测试多个厂家的COM组件。这些COM组件都是按照行业某规范提供一组函数接口,函数名和参数都规定好的,各厂家一致,内部实现不同。
我希望用一个检测软件,运行时选择不同厂家的那个dll文件,就能调用到这厂家COM组件接口的函数。那么首先各厂家COM dll文件的文件名是不确定的,#import ****.dll no_namespace 这里是否有麻烦? 更重要的是,各厂家COM组件中的类的名字不确定,无法在编写测试软件时导入,网上搜到的调用方法有:
CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid);
CComPtr<IGetRes> pGetRes; //智能指针 实际情况IGetRes不确定
pGetRes.CoCreateInstance(clsid);
pGetRes->Hello();

ProgID 等信息也许还可以查,测试程序运行时传进去,但 IGetRes 这个类接口名测试程序编译时就定了,运行时改不了。
如果各厂家COM组件类接口名,文件名现在都未知,那这个办法还行得通吗?应该如何动态调用呢?

...全文
918 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tieren428 2017-03-03
  • 打赏
  • 举报
回复
引用 7 楼 Saleayas 的回复:
我给你提供一个方式。 我们当年有一个要求,根据不同的硬件来调用不同的 COM。类似于硬件的驱动,但是不是驱动。 每一类设备向程序提供自己需要的 COM 的 CLSID。 根据这个 CLSID 直接创建实例,返回接口。 以后使用这个接口,就和具体是那个 COM 就无关了。
对,我的应用环境跟您说的很像!各家厂商的COM组件与各自的硬件通信,我写检测软件分别调用他们。 问题现在不知道有几家厂商(也许陆续增加)也不知他们组件的接口名字。有些东西可以在检测软件运行时去获取,比如CLSID,接口的IID,但是检测软件编程时,好像必须知道接口名字,不然CComPtr<IGetRes> pGetRes; 或者IGetRes *ptr; 这样的代码不好写,也无法正确通过虚函数表调用函数。 您说的“”从CLSID直接创建实例,返回接口“” ,是返回接口的指针还是什么?光有接口指针不知道接口名字,无法实例化去访问其成员函数吧?能否再说详细一些
Saleayas 2017-03-03
  • 打赏
  • 举报
回复
我给你提供一个方式。 我们当年有一个要求,根据不同的硬件来调用不同的 COM。类似于硬件的驱动,但是不是驱动。 每一类设备向程序提供自己需要的 COM 的 CLSID。 根据这个 CLSID 直接创建实例,返回接口。 以后使用这个接口,就和具体是那个 COM 就无关了。
Dobzhansky 2017-03-03
  • 打赏
  • 举报
回复
如果有类型库,可以得到所有信息,如果是 IDispatch ,无需头文件就可以调用
赵4老师 2017-03-02
  • 打赏
  • 举报
回复
学会使用OleView.exe
tieren428 2017-03-02
  • 打赏
  • 举报
回复
引用 3 楼 Dobzhansky 的回复:
接口都是基于 IDispatch 的吗? dll 内是否包含了类型库呢?
我自己弄得COM组件接口是基于IDispatch 的。 现在在研究QueryInterface然后invoke的办法能不能绕开这个接口名,刚接触不懂得太多了。 其他厂商的COM怎么弄得我就不知道了。
oyljerry 2017-03-02
  • 打赏
  • 举报
回复
第三方库都需要文档等来描述,这样也就是所谓的SDK
Dobzhansky 2017-03-02
  • 打赏
  • 举报
回复
接口都是基于 IDispatch 的吗?
dll 内是否包含了类型库呢?
tieren428 2017-03-02
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
学会使用OleView.exe
谢谢! 运行OleView.exe能看到已注册的COM组件的信息, 但是编写上层测试程序时还没有获得COM组件文件,不知道第三方COM组件的类接口名,代码就不好写。 比如 HRESULT hr=CLSIDFromProgID(OLESTR("myCom.GetRes"),&clsid); IGetRes *ptr; hr=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER, __uuidof(IGetRes),(LPVOID*)&ptr); 这种调用方法,没有获得COM组件文件前,IGetRes 这个名字都还不知道,怎么解决呢?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧