致命错误C1084:无法读取类型库文件:'Smegui.tlb':加载类型库/ DLL时出错

时间:2010-06-16 00:47:45

标签: visual-c++ dll typelib

我正在尝试构建一个旧版本的应用程序,其中包含用Visual Studio 2003编写的VC ++项目。

我的操作系统是Windows 7企业版(64位)。 当我尝试构建解决方案时,我收到以下错误:

  • 错误C4772:#import引用了缺失类型库中的类型; '__missing_type__'用作占位符
  • 致命错误C1084:无法读取类型库文件:'Smegui.tlb':加载类型库/ DLL时出错。

他们都抱怨以下导入声明:

#import "Smegui.tlb" no_implementation

这不是文件路径不正确的情况,因为重命名Smegui.tlb文件会导致编译器抛出另一个错误,说它无法找到库。

Smegui来自另一个依赖的应用程序。我想也许我错过了一个dll但是没有Smegui.dll这样的东西。

我所知道的.tlb文件是他们是一个类型库,你可以使用tlbexp.exe或regasm.exe从程序集创建它们(后者也用COM注册程序集)

还有一个Apache Ant构建脚本,它使用自定义任务来调用devenv.com来构建项目。这与构建服务器最初用于构建应用程序的脚本相同。当我尝试运行它时,它给了我相同的错误。

关于这一点最奇怪的是,我知道它应该工作,因为它是从颠覆中全部检查出来的。我尝试了很多不同的管理员与用户提升,VS与Ant构建,清理,发布的组合。

我已经成功构建了大约5次,但构建似乎是不确定的。

如果有人能够了解这个tlb的东西是如何工作的,或者这个错误可能意味着什么,我会非常感激。

4 个答案:

答案 0 :(得分:4)

http://msdn.microsoft.com/en-us/library/sce74ah7%28VS.71%29.aspx

smegui.tlb正在引用编译器找不到的其他一些tlb。如果你有.idl for smegui,你可以弄清楚对方是什么。我怀疑丢失的tlb是原始构建机器已经注册但是你的机器没有注册的东西。

类型库是一组接口,coclasses和枚举的二进制描述。它们通常是为COM组件生成的,在tlbexp和regasm的情况下,tlb是从程序集元数据创建的。对于本机COM组件,它们通常由midl工具从idl(接口描述语言)文件生成。

编辑:

我刚注意到你在x64 Windows上。您是否使用新版本的Visual Studio构建项目?如果是这样,您的目标是x86还是x64?如果是后者,它可能只是编译器无法找到的32位组件(或者不太可能是x86编译器在x86目标下无法找到的x64组件),对于WOW64,注册表是针对x86进行虚拟化的x64应用程序。

答案 1 :(得分:4)

我找到了一个更可靠的解决方案:用oleview.exe打开tlb,然后关闭它。

不确定这实际上是做什么但每次都有效。

我认为oleview实际上是Visual Studio附带的示例之一,但我没有时间调试它并看看它在做什么。

答案 2 :(得分:3)

我遇到了此错误,因为一个类型库正试图加载一个找不到的依赖类型库。即使从属类型库位于同一目录中,即使该目录位于可搜索路径中,编译器也会在加载第一个类型库时出错,但在错误中未提及从属类型库。

要找到伪缺少的类型库,我在编译过程中运行了进程监视器(procman64.exe)。这表明在成功加载报告的类型库之后,找不到依赖的类型库。它甚至显示了它正在寻找依赖类型库的所有地方,而这些地方都不是它应该去的地方(例如:procman output)。

解决方法是将<PreBuildEvent>添加到项目中,以将依赖的.tlb文件复制到实际正在搜索的目录之一。

<PreBuildEvent>
  <Command>copy /Y ..\Lib\Interop\CWSpeechRecLib.tlb .\</Command>
</PreBuildEvent>

答案 3 :(得分:0)

好吧,我终于找到了为什么我设法让它有时建立而不是其他人...等等。

只要我使用提升的管理员权限运行构建脚本并让它尽可能地发生,直到发生错误,然后在受保护的管理员成功时再次运行构建脚本。这些步骤必须按照确切的顺序完成,两者之间没有其他步骤。如果我尝试在Visual Studio中构建它不起作用(虽然我确实让它成功了一次)。可能是某种虚拟化问题,尽管它仍然没有多大意义。

我不再需要这方面的帮助了,我知道如果不确切知道构建的内容,完全回答这个问题可能是不可能的。但是,如果有人有更多的想法,我会乐意接受它们。

干杯,

Steiny