我有一个VCL Forms应用程序,其中包含对我创建的BPL文件的引用。我将BPL中框架组件的单元名称添加到VCL应用程序主窗口的uses子句中。应用程序构建正常,但是当我运行它时,它在到达项目文件中的第一行“Application.Initialize”之前就已经死了。如果我从uses子句中注释掉框架的单元,应用程序就会启动并运行正常。
应用程序启动时可能导致致命错误的原因是什么?
我猜测在启动时加载BPL文件存在问题,但我无法找到问题。谢谢。
以下更多信息...... VCL应用程序在XE5中,我试图将其转换为BPL。整个应用程序驻留在一个TFrame控件中,该控件包含许多其他按钮和框架,可以访问应用程序的所有基础功能。然后将这个“主框架”放置在应用程序的主要形式中,除了一些菜单项之外它是空的。原始应用程序构建并运行良好。
我创建了一个新的BPL项目,并添加了这个“主框架”组件,以创建一个基本上是我的整个应用程序的BPL包,并且可以像以前一样用于普通的独立exe应用程序,或者添加到RemObjects Hydra插件模块,最终嵌入到C#应用程序中。具有单个“主框架”组件的BPL项目构建正常,没有错误。
然后我创建了一个新的VCL Forms应用程序,其中包含一个空的主窗体,并设置了Project的“Options-> Packages-> Run-time Packages”以包含我的新BPL,并检查了“Link with运行时包“选项。我将“主框架”单元添加到主窗体的uses子句中,所有内容都构建没有错误。
问题:当我从XE5运行应用程序时,它似乎开始正常启动,但它在到达第一行代码“Application.Initialize;”之前就已经死了。在项目文件中。请注意,我还没有编写任何代码来创建BPL中包含的“主框架”的实例。我只将其单位添加到uses子句中。没有显示任何错误消息,并且没有任何内容发布到XE5中的构建或输出窗口。如果我从uses子句中注释掉“main frame's”单元,则应用程序运行正常,并显示空的主窗口。
注意:该应用程序使用JVcl,NativeXml,TsiLang,ZipForge,& FastReports。
答案 0 :(得分:0)
您描述的症状是加载时间相关性解析失败的症状。根据您的描述,很可能是由于您的BPL文件未在加载时定位。加载时间包依赖项由系统加载程序处理,因此DLL搜索顺序适用。通常,您将确保依赖模块与可执行文件位于同一目录中。
在调试器下运行时,无法很好地处理加载时依赖性故障。如果直接启动可执行文件,您将收到更好的错误消息。如果这还不足以识别问题,请在配置文件模式下使用Dependency Walker来获取任何加载时错误的详细诊断。
关于Embarcadero对软件包部署的建议的最后评论。官方Embarcadero documentation仍建议将共享软件包安装到系统目录中。虽然这是20年前在Windows 3.1下的常见做法,但没有人应该在21 st 世纪中这样做。请不要遵循Embarcadero的这个特别建议,请尊重系统目录属于系统的事实。