3

我有一组相互依赖的 Visual C++ 9 COM 组件项目。

ComponentA 将其类型库发布到ComponentA.tlb. ComponentB 导入ComponentA.tlbComponentB.idl发布ComponentB.tlb. 中的方法签名ComponentB.idl包含在中定义的类型的参数ComponentA.tlb。ComponentA 和 ComponentB 项目都可以编译。

ComponentC#import和into ComponentA.tlb-这突然失败了ComponentB.tlbstdafx.h

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

以及后来的一组

error C2440: 'return' : cannot convert from '__missing_type__ *' to '__missing_type__'

对于使用ComponentA.tlb. 通常在ComponentA.tlb未注册时会发生这种情况,但我肯定已经regtlib在 regedit 中运行并看到它已注册。ComponentA.tlb准确地存在于注册表中指定的路径上。

问题的根源是什么?如何解决问题?

4

2 回答 2

2

不确定我是否遇到与您相同的问题,但我会在第一次构建时收到 C4772 错误,然后在第二次构建时它会消失。

解决方案是将 A.tlb 复制到项目目录中(复制“$(OutDir)\A.tlb .”)作为预构建步骤,然后将其作为链接后步骤删除。

我的程序在 A.tlb 然后 B.tlb 上执行 #import(这取决于 A.tlb 中的类型)。A.tlb 的#import 成功,但 B.tlb 失败。两个 TLB 文件都在一个包含目录中,并且两个底层 .DLL 都没有使用 regsvr32 注册(如果注册了 COM 对象,一切正常)。

尽我所能,#import 语句不支持 C++ 包含路径,这就是为什么在未注册 A.dll 时找不到 A.tlb 的原因。

于 2012-11-30T05:03:21.550 回答
1

看起来问题可以归因于更改 ComponentA 接口。一旦 ComponentA 接口在其 typelib 注册时发生更改,问题就会开始出现。

我使用的解决方法是取消注册 ComponentA 类型库并再次注册它 - 我制作了一个小程序(regtlib 只是无法取消注册类型库),它调用RegisterTypeLib()并且UnregisterTypeLib()看起来问题已经消失了。

于 2010-12-10T09:58:07.030 回答