我有一组相互依赖的Visual C ++ 9 COM组件项目。
ComponentA将其类型库发布到ComponentA.tlb
。 ComponentB将ComponentA.tlb
导入ComponentB.idl
并发布ComponentB.tlb
。方法ComponentB.idl
中的签名包含ComponentA.tlb
中定义的类型参数。 ComponentA和ComponentB项目都编译好了。
ComponentC #import
ComponentA.tlb
和ComponentB.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
完全出现在注册表中指定的路径上。
问题来源是什么以及如何解决问题?
答案 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()
看起来像问题消失了。