3

我正在维护一个 VS2010 项目,其中包含许多交叉引用的 COM 库。我正在尝试以可以从安装了 VS2010 的随机工作站构建的方式配置项目。工作站可以是 32 位和 64 位的,所以如果我将项目配置为“注册输出”,则构建将无法在 32 位机器上构建,因为无法加载 64 位 DLL 来调用 DllRegisterServer。

这是一个示例:项目 B 中的 Typelib 引用了项目 A 中的 typelib。项目 C 将通过以下语句引用项目 B:

#import "B.tlb"

由于库 B 引用 A,当 B.tlb 被导入时,编译器会尝试从 A 加载类型。因此,如果 A 未注册,编译将失败并显示:

error C4772: #import referenced a type from a missing type library ...

我尝试使用 OleView 应用程序打开 B.tlb,如果使用 regsvr32 注册,它肯定只显示库 A 引用的正确文件名。

所以,我的问题是:是否有任何替代方法可以让库引用正确解析,而无需注册 TLB,只需将所有文件以某种方式放在同一目录中,或附加某种清单?例如,将库的 TLB 重命名为 .tlb 或类似的名称。

4

3 回答 3

4

有一个不错的选择:将 .tlb 文件的路径添加到 VC++ 目录 -> 可执行目录 这会将路径添加到 PATH 环境变量,该变量将提供给编译器。据此: http: //msdn.microsoft.com/en-us/library/sce74ah7.aspx导入的所有.tlb REFERENCED 仅在PATH 和LIB 中搜索。

于 2014-10-24T11:42:48.830 回答
2

尝试先导入引用的 A.tlb,或使用 include() 选项将其列在 B.tlb 的导入中。

如果您可以避免不必要地引入其他引用,请仅#import您计划使用的界面部分。

于 2010-09-22T21:14:09.063 回答
1

最简单的方法是在使用时将所有 *.tlb 文件放在 dir 中。

取决于您的项目配置。将所有 *.tlb 文件复制到:$(OutDir), $(ProjectDir), dir #import 文件在哪里,生成 *.tlb 时的 dir 等

问候, 马吕斯

于 2013-01-15T17:43:53.947 回答