VS2019下使用C++实现兼容无源码COM服务端同接口替代组件的方法
兼容COM服务端实现步骤
第一步:合并IDL定义到项目IDL文件
不要直接替换或者单独导入FooObject.idl,而是将FooObject.idl中的内容合并到ATL项目默认生成的ATLProject1.idl中:
- 将
FooObject.idl中所有interface定义、typedef、常量定义复制到ATLProject1.idl的library块外部 - 将
FooObject.idl中library块内的coclass定义、importlib指令复制到ATLProject1.idl的library块内部 - 编译项目,此时生成的
ATLProject1_i.h、ATLProject1_i.c会同时包含原有LIBID定义和你需要的接口、CoClass定义,不会出现编译错误
第二步:创建对应CoClass的ATL实现类
- 在项目右键菜单选择「添加 -> 类 -> ATL简单对象」
- 填写对象信息时,必须保证ProgID、CLSID与
FooObject.idl中对应CoClass的定义完全一致,其余选项保持默认即可 - 完成添加后,项目会自动生成该类的
.h、.cpp文件,以及在ATL对象映射表中添加对应的类厂注册项
此前你替换IDL后注册成功但创建对象报错,是因为IDL仅定义了COM元数据,注册时只写入了注册表的类型库和CoClass关联项,但DLL内部没有对应CoClass的C++实现类和类厂映射,COM运行时找不到实例化入口导致报错。
第三步:自动生成接口方法骨架代码
- 右键点击刚才创建的ATL类,选择「添加 -> 实现接口」
- 在弹出的向导中,选择「类型库」作为来源,选中当前项目生成的类型库,列表中会显示所有你从
FooObject.idl中导入的接口 - 选中需要实现的接口,点击确认,VS会自动在类中生成所有接口方法的声明与空实现,默认实现返回
E_NOTIMPL
第四步:验证与开发
- 编译项目,执行
regsvr32 ATLProject1.dll完成注册 - 使用COM测试工具创建目标CoClass对象,此时不会再返回80040154错误
- 依次实现所有接口方法的业务逻辑即可
内容的提问来源于stack exchange,提问作者M.M
相关产品推荐
相关产品推荐

