1

在过去的两天里,我一直在努力解决这个问题,似乎无法取得任何进展......

几乎从一个时刻到下一个时刻,Delphi XE2 将不再正确编译我的一个项目。也就是说,它实际上编译时没有错误,但在运行时我得到资源未找到错误,因为它本质上是主要的“表单”(在这种情况下它实际上是一个数据模块)。我已经从源代码控制恢复到项目的旧版本,我知道这些版本肯定可以正常工作,但无济于事。由此看来,它似乎一定是 Delphi/IDE 本身内部的东西,而不是项目源代码中的东西。但是,我也无法通过一个简单的测试项目或任何其他现实项目来重现该问题......它只发生在这个项目中。

另一个奇怪的事情是,当我使用 XN Resource Explorer 查看生成的二进制文件时,一切看起来都应该是:错误消息中提到的表单资源实际上是存在的并且完好无损......

在某些时候,我怀疑这可能是由我在 IDE 中安装的一位专家(例如 Uwe 的平台和 OI 专家以及 VersionInsightPlus、Andreas 的 IDEFixPack 和 DDevExtensions、GExperts)的错误引起的,但即使在禁用所有这些问题之后坚持。

不幸的是,我无法准确追踪何时开始发生这种情况,因为我已经工作了一段时间而没有实际运行二进制文件,修复 x64 目标的编译器警告和错误,调整更新的第三方工具的构建事件(本地化和许可证保护)等等……

有没有其他人见过这样的事情发生?关于如何确定这一点的更多想法?


有关该项目的更多详细信息:

  • 它是使用 Add-In-Express 框架(即 COM-DLL)构建的 Outlook 插件。
  • “主表单”是一个TDataModule-后代——我们还将我们自己的祖先类插入到层次结构中,即“插件模块”不是直接继承自TadxCOMAddInModule——自定义祖先表单的资源也似乎存在并且完好无损使用资源查看器检查时输出二进制文件。
  • 没有为 Win32 和 Win64 平台构建的运行时包。

如果您认为我错过了提及任何其他可能相关的细节,请告诉我。

更新: 我现在已将相关资源转移到另一台机器上。有趣的是,我在那里编译的 DLL 没有出现问题 - 在那台机器上......当我将它转移回原始机器并尝试调用它时,错误又回来了(强调这一点:这是确切的同一个 DLL 在一台机器上生成一个EResNotFound但在另一台机器上不生成。当然,一旦我发现了这一点,我也进行了反向测试,你瞧,在原始机器上编译的 DLL 在另一台机器上运行没有错误......似乎这毕竟不是德尔福问题......但那是什么?

两台机器的区别:

  • 机器 1(出现问题的机器):Windows 7 Ultimate English 64bit with Delphi XE2 Update 4
  • 机器 2:Windows 7 Professional German 32bit with Delphi XE2 Update 3

在第三台机器上,除了没有 Delphi 外,几乎与第一台机器相同,两台机器生成的 DLL 都可以完美运行。

4

2 回答 2

1

在这里看到你的问题我有点惊讶。:)

在最近的 Delphi XE2 更新 4 中,我们遇到了许多严重问题。尽管我们从未遇到或报告过“找不到资源”错误,但我认为此更新可能是原因之一。你安装了吗?

我想到的另一件事是用于 Office 控件(命令栏和功能区)的图像。可能它们以某种方式损坏了,运行时代码无法加载它们并报告此错误。

无论如何,如您所知,这些只是我的猜测,如果您需要我们的 Office 插件方面的帮助,请联系 Add-in Express 支持服务,我们会尽力提供帮助。

于 2012-05-11T14:36:36.433 回答
0

更新:似乎我有点太快了,得出结论。显然,Sisulizer 解决方案也应该执行回退到主资源块。我现在已将此问题提交到产品论坛,一旦解决,我将在这里报告。


好吧,谜团终于解开了:

我关闭了Sisulizer中“复制所有资源”的选项,试图减小生成的资源 DLL 的大小,然后忘记了它......

我还没有完全意识到标准 Delphi 资源 DLL 方法对 Sisulizer “搭载”的本地化的影响——尤其是这是一个孤注一掷的交易:我们之前的翻译解决方案实现了一个可以读取任何资源的后备机制而是在主机二进制文件的外部资源 DLL 中找不到。Sisulizer 似乎不是这种情况 - 至少不是开箱即用的......因此,就应用程序而言,本地化资源 DLL 中不包含的任何资源都不存在。
我也没有意识到仅仅存在一个与主二进制文件具有相同基本名称的文件和一个与当前系统的默认语言环境匹配的扩展名(例如.ENor .DE)会自动导致 VCL 加载它......

没有出现错误的机器要么仍然有旧的、更大的(=完整的)资源 DLL,要么根本没有资源 DLL。

于 2012-05-24T14:25:00.247 回答