2010-01-08 52 views
2

我们有一个成熟的C++ COM代码库,已经建立,注册并运行了很多年。这包括许多开发人员机器和自动构建机器。为什么我的DLL中的类型库损坏(注册返回TYPE_E_CANTLOADLIBRARY)?

代码库建立了几个dll和exes。其中一些是COM服务器。

典型设置是使用XP64两个Visual Studio 2005和2008年

我们有32位和64位版本。

突然我们的xp64 2005 autobuild机器出现故障。 唯一的代码更改是在C++帮助程序方法中进行的简单更改以及某些版本号的更新。

我们看到的失败是无法注册dll的x64发行版本。

失败似乎是由损坏的DLL造成的。 该dll构建成功,但尝试注册失败TYPE_E_CANTLOADLIBRARY。

该DLL应该有内置的类型库(通过包含在rc文件中)。

这之前一直工作,仍然工作在我们的其他机器,XP64 VS 2005和2008年

当检查破碎的DLL类型库IDL源可以看到的二进制 - 虽然它是在一个不同的位置比在一个非破碎版本的DLL。

破损的DLL无法注册我们的其他机器 - 同一台机器成功注册了他们自己的本地生成的相同的DLL。

Oleview在打开dll时也出现同样的错误。

我在寻找任何可能有所帮助的建议或类似经历?

回答

1

嗯,我认为我们已经将此视为视觉工作室错误。

我们发现我们的自动编程运行的路径最近发生了变化 - 增加了编译器生成的任何文件的绝对路径名长度。

我们也知道64位版本构建的目标文件夹将具有我们任何配置的最长路径名。

我们已经缩短了路径(通过重命名我们的源代码树被检出的顶级目录)并且问题看起来消失了 - 显然我们会重复几次以确保它不是吸虫。

我在想,当Visual Studio在二进制文件中插入绝对路径名时 - 它仍然存在 - 它可能会超出缓冲区......并破坏二进制文件。

+0

我认为我们看到了同样的事情,但我们从未想出解决方案。我们的构建大部分时间都在工作,但有时候会以这种方式失败。这可能是一个路径长度问题,谢谢你的除草。 – 2010-01-12 06:34:05

1

这可能与构建服务器上的磁盘变坏一样简单。您的帖子中没有任何内容表明任何更复杂的东西。虽然看到IDL回到DLL中非常奇怪,但类型库是二进制的。

+0

我想他是指OLEView显示的文本,当被要求打开一个typelib时 - 它解码typelib并以与源IDL非常相似的形式呈现它。 – sharptooth 2010-01-08 14:32:46

+0

对不起,我指的是二进制DLL本身内嵌入的文本 - 现在我再次看到的实际上是一个集合注册表项实现idl - 顺便winmerge现在支持二进制差异,这是不错的... – morechilli 2010-01-08 14:43:52