C4772即使在注册和存在类型库时也是如此

时间:2010-03-05 13:21:15

标签: visual-c++ import visual-studio-2008 com regtlib

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

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

ComponentC #import ComponentA.tlbComponentB.tlb stdafx.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并在注册表中注册它。 ComponentA.tlb完全出现在注册表中指定的路径上。

问题来源是什么以及如何解决问题?

2 个答案:

答案 0 :(得分:2)

不确定我遇到了和你一样的问题,但是我会在第一次构建时遇到C4772错误,然后它会在第二次构建时消失。

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

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

最好的我可以说,#import语句不支持C ++包含路径,这就是为什么在A.dll未注册时无法找到A.tlb的原因。

答案 1 :(得分:1)

看起来问题可归因于更改ComponentA接口。一旦ComponentA接口在其类型库被注册时发生变化,问题就会开始出现。

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