【发布时间】:2021-12-27 04:52:58
【问题描述】:
我有一个进程内 COM 服务器 FooObject.dll,我不再拥有它的源代码,但我想使用相同的接口在非托管 C++ 中编写一个新实现。我正在使用 Visual Studio 2019 最新更新。
我该怎么做?
到目前为止,我建立了一个这样的项目:
- 使用https://stackoverflow.com/a/42074044/1505939 中的说明提取
FooObject.tlb。 - 使用 OleView.exe 从
FooObject.tlb创建FooObject.idl。 - 在 Visual Studio 中创建一个类型为“ATL 项目”的新项目,使用选项“允许合并代理/存根代码”和“支持 COM+ 1.0”以及“dll”类型。
我(单独)尝试了以下事情
-
在“源文件”下,右键单击 -> 添加现有项 ->
FooObject.idl.- 这导致
ATLProject1_i.c和.h重新生成,只包含来自FooObject.idl的定义,然后dllmain.h无法编译,因为它引用了LIBID_ATLProject1Lib,它曾经在ATLProject1_i.c中但不是现在。所以我想这不是预期的方法。 - 还尝试添加
FoOObject.idl和删除ATLProject1.idl,它再次成功构建,甚至允许使用注册所有相同类的regsvr32注册(可以通过OleView 中的类型库浏览器查看);但仍然没有实现,并且在测试容器中创建一个对象会给出 80040154,就好像它没有注册一样。
- 这导致
-
将
#import "FooObject.dll添加到ATLProject1.cpp的顶部,在includes 下。项目编译没有错误,但没有生成导入文件。 -
将
importlib "FooObject.idl"添加到 ATLProject1.idl 文件。它再次编译没有错误,但不生成任何导入文件。 -
使用
midl /header FooObject.h /env win32 FooObject.idl手动创建导入文件。这确实创建了导入文件,我可以将它们包含在#include "FooObject.h"中并且不会出错。
在所有最后 3 种情况下都没有错误,但不清楚如何为 FooObject.idl 中的 CoClasses 生成实现代码,就像我去“添加新项目”并选择要添加的 ATL 简单对象时出现的那样.所以我不确定如何从这里开始为我正在尝试创建的对象中的函数体编写代码。
(我之前的经验是使用非 Microsoft 供应商,其编辑器只允许您从注册表中添加任何 CoClass,它会生成框架代码)。
【问题讨论】:
标签: c++ com visual-studio-2019 atl idl