【问题标题】:How to run Delphi application on machine where Delphi is not installed如何在未安装 Delphi 的机器上运行 Delphi 应用程序
【发布时间】:2017-05-03 07:07:56
【问题描述】:

我有使用运行时包构建的 Delphi 应用程序 .exe。我需要将 exe 和其他 bpls/dll 存储在单独的(相对路径)文件夹中。 例如,.exe 将位于一个文件夹中,而所有其他运行时软件包 dll/bpls 将位于另一个文件夹中。如何做到这一点? 如果我在另一台未安装 delphi 的机器上执行此操作,则会出现所需软件包的常见错误。

【问题讨论】:

  • 准确和信息丰富的标题有助于快速搜索问题和回答问题。另请详细说明您为实现目标所做的努力。
  • 把所有的包和可执行文件放在同一目录下
  • 在同一目录中它工作正常。但我的要求是将所有包放在 一个目录 和可执行 .exe 在 另一个目录 即如果 .exe 在目录 c:\ClientApp 包将在目录 c:\ClientApp\Packages

标签: delphi delphi-2007


【解决方案1】:

当您在启用运行时包的情况下编译 EXE 时,您必须将所有使用过的 BPL 文件与您的 EXE 一起部署。

如果 EXE 在编译时静态链接到 BPL,则它们必须存在于操作系统可以在加载 EXE 时找到它们的位置,然后才能实际运行。您必须将 BPL 放在与 EXE 相同的文件夹中,或者放在系统的 PATH 环境变量中包含的文件夹中。

如果 EXE 没有静态链接到 BPL,并且它们是由 EXE 代码在运行时使用 RTL 的 LoadPackage() 函数加载的,那么最好的选择是在加载它们时使用绝对路径。如果这不是一个选项,并且您必须使用相对路径,那么您可以使用 SetDllDirectory() 或 AddDllDirectory() 将 BPL 文件夹添加到操作系统搜索路径,然后再调用 LoadPackage()。

阅读 MSDN 文档,了解 Windows 如何在运行时定位 DLL(BPL 只是具有内置 Delphi RTL 支持的 DLL):

Dynamic-Link Library Search Order.

【讨论】:

  • 正如你提到的 如果 EXE 不是静态链接到 BPL,并且它们是由 EXE 代码在运行时使用 RTL 的 LoadPackage() 函数加载的,那么最好的选择是加载时使用绝对路径....加载时如何使用绝对路径?你能详细说明一下吗?是否有任何选项可以找到路径并将所有必需的包放在该路径中。
  • @Soham 如果 BPL 文件夹路径相对于 EXE 文件夹路径,则查看 Conversion between absolute and relative paths in Delphi。您可以使用ExtractFilePath(ParamStr(0))获取EXE文件夹路径。
  • 在同一目录中它工作正常。但我的要求是使用选项构建应用程序c:\ClientApp 包将位于目录 c:\ClientApp\Packages
  • 使用此文件夹结构 (如果 .exe 在目录“c:\ClientApp”中,包将在目录“c:\ClientApp\Packages”中) 应该在没有安装delphi的机器。
  • @Soham ExePath := ExtractFilePath(ParamStr(0)); LoadPackage(ExePath+'Packages\filename.bpl'); 但这仅适用于动态加载。对于静态链接,您必须将C:\ClientApp\Packages 添加到系统PATH。
猜你喜欢
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
相关资源
最近更新 更多