You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi RAD Server 10.4.2:两个共享公共单元的服务器包加载失败问题咨询

在RAD Server多个BPL包间安全共享单元的解决方案

你遇到的这个错误是Delphi运行时包的典型冲突问题:同一个单元UntAccess.pas被打包进了两个独立的RAD Server包(ProjA.bpl和ProjB.bpl),而Delphi的运行时环境不允许同一个单元在进程中存在多个实例,否则会引发全局变量冲突、初始化逻辑重复执行等严重问题。下面是最稳妥的解决办法:

方法一:将共享单元封装到独立的运行时包

这是Delphi官方推荐的多包共享单元的标准方案,步骤如下:

  1. 创建共享运行时包
    • 在Delphi中新建一个运行时包项目(比如命名为SharedAPIUtils.bpl)
    • 将UntAccess.pas以及其他需要在多个RAD Server包间共享的单元添加到这个新包中
    • 打开包的项目选项,确认:
      • 目标平台是Win64(和你的RAD Server包一致)
      • 包类型设置为Runtime Package
      • 取消勾选"Link with runtime packages"(避免循环依赖)
  2. 修改原有RAD Server包的依赖
    • 打开ProjA.bpl和ProjB.bpl的项目选项,勾选"Link with runtime packages"
    • 在"Packages"选项卡的"Required"列表中添加你刚创建的SharedAPIUtils.bpl
    • 从ProjA和ProjB的项目中移除UntAccess.pas文件(不要再把它直接打包进这两个包)
  3. 配置RAD Server加载顺序
    • 打开emsserver.ini的[Server.Packages] section,把SharedAPIUtils.bpl放在ProjA和ProjB的前面,因为依赖包必须先于使用它的包加载,比如:
      [Server.Packages]
      Package0=C:\...\SharedAPIUtils.bpl
      Package1=C:\...\ProjA.bpl
      Package2=C:\...\ProjB.bpl
      
  4. 部署共享包
    • 将编译好的SharedAPIUtils.bpl放到RAD Server能够访问的目录(可以和ProjA、ProjB放在同一个目录,或者添加到系统PATH环境变量中)

关键注意事项

  • 确保所有包(共享包、ProjA、ProjB)都使用相同的Delphi版本(10.4.2)和目标平台(Win64)编译,避免版本不兼容
  • 如果UntAccess.pas包含全局变量或者初始化/终结代码,一定要确保这些逻辑在共享包中只会执行一次,不要在多个包中重复触发
  • 不要尝试通过“复制单元文件到不同目录并分别编译”的方式绕过这个问题,这会导致更隐蔽的内存冲突和逻辑错误

内容的提问来源于stack exchange,提问作者JRG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:42:48