2

我有一个 VCL Forms 应用程序,其中包含对我创建的 BPL 文件的引用。我将 BPL 中框架组件的单元名称添加到 VCL 应用程序主窗口的 uses 子句中。该应用程序构建良好,但是当我运行它时,它在到达项目文件中的第一行“Application.Initialize”之前就死了。如果我从 uses 子句中注释掉框架的单位,应用程序就会启动并运行良好。

什么可能导致应用程序启动时出现致命错误?

我猜在启动时加载 BPL 文件有问题,但我找不到问题。谢谢你。

更多信息如下... VCL 应用程序位于 XE5 中,我正在尝试将其转换为 BPL。整个应用程序驻留在一个 TFrame 控件中,其中包含许多其他按钮和框架,可以访问应用程序的所有底层功能。然后这个“主框架”被放置在应用程序的主窗体中,除了几个菜单项外,它是空的。原始应用程序构建并运行良好。

我创建了一个新的 BPL 项目,并添加了这个“主框架”组件,以创建一个 BPL 包,它本质上是我的整个应用程序,可以像以前一样用于普通的独立 exe 应用程序,或者添加到一个 RemObjects Hydra 插件模块,并最终嵌入到 C# 应用程序中。具有单个“主框架”组件的 BPL 项目构建良好,没有错误。

然后我用一个空的主窗体创建了一个新的 VCL Forms 应用程序,并将项目的“选项->包->运行时包”设置为包含我的新 BPL,并选中“与运行时包的链接”选项。我在主窗体的uses 子句中添加了“主框架”单元,一切都没有错误地构建。

问题:当我从 XE5 运行应用程序时,它似乎开始正常启动,但在到达第一行代码“Application.Initialize;”之前就死机了 在项目文件中。请注意,我还没有编写任何代码来创建位于 BPL 中的“主机”实例。我只是将它的单位添加到使用子句中。XE5 中没有显示错误消息,也没有任何内容发布到 Build 或 Output 窗口。如果我从 uses 子句中注释掉“主框架”单元,则应用程序运行良好,并显示空的主窗口。

注意:该应用程序使用 JVcl、NativeXml、TsiLang、ZipForge 和 FastReports。

4

1 回答 1

0

您描述的症状是加载时间依赖性解决失败的症状。根据您的描述,这很可能是由于您的 BPL 文件在加载时没有找到。加载时包依赖项由系统加载程序处理,因此适用 DLL 搜索顺序。通常,您会确保依赖模块与可执行文件位于同一目录中。

在调试器下运行时,加载时间依赖失败没有得到很好的处理。如果您直接启动可执行文件,您将收到更好的错误消息。如果这还不足以识别问题,请在配置文件模式下使用 Dependency Walker 来获取任何加载时间错误的详细诊断信息。

关于 Embarcadero 对包部署的建议的最后一条评论。Embarcadero官方文档仍然建议将共享包安装到系统目录。虽然这是 20 年前在 Windows 3.1 下的常见做法,但在 21 世纪不应该这样。请不要听从 Embarcadero 的这个特别建议,请尊重系统目录属于系统的事实。

于 2014-03-27T08:56:28.680 回答