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

Delphi 10.2.3:如何在加载BPL运行时包前获取其描述信息

在Delphi 10.2.3中预读取BPL的自定义描述信息

针对你需要在加载BPL前获取非版本信息FileDescription字段的描述需求,以下是两种可行的实现方案:

方法一:给BPL嵌入自定义资源段

通过在BPL中添加自定义RCDATA资源,主程序以数据文件模式加载BPL(不初始化包),读取资源内容即可获取描述。

步骤1:创建自定义资源文件

新建文本文件并命名为BPLDesc.res,内容格式如下:

// 格式:资源名称 资源类型 描述内容
BPL_CUSTOM_DESC RCDATA "用户权限管理模块"

可自行修改资源名称、类型和描述内容。

步骤2:关联资源到BPL项目

打开BPL的.dpk文件,添加编译指令引入资源:

{$R BPLDesc.res}

确保资源文件与dpk文件在同一目录,或指定完整路径。

步骤3:主程序读取自定义资源

编写读取函数,使用LoadLibraryEx以数据模式加载BPL,避免触发包初始化:

function GetBPLCustomDesc(const ABPLPath: string): string;
var
  hModule: THandle;
  hRes: THandle;
  pResData: PChar;
  ResSize: DWORD;
begin
  Result := '';
  // 加载BPL作为数据文件,不执行初始化逻辑
  hModule := LoadLibraryEx(PChar(ABPLPath), 0, LOAD_LIBRARY_AS_DATAFILE);
  if hModule = 0 then Exit;
  try
    // 查找自定义资源
    hRes := FindResource(hModule, 'BPL_CUSTOM_DESC', RT_RCDATA);
    if hRes = 0 then Exit;
    // 获取资源大小并读取内容
    ResSize := SizeofResource(hModule, hRes);
    pResData := LockResource(LoadResource(hModule, hRes));
    if Assigned(pResData) then
      Result := Copy(pResData, 1, ResSize);
  finally
    FreeLibrary(hModule);
  end;
end;

调用示例:

ShowMessage(GetBPLCustomDesc('AuthManage.bpl'));

方法二:利用自定义版本信息字段

如果希望描述与标准版本信息统一管理,可在BPL的版本信息中添加自定义字段,主程序读取该字段。

步骤1:给BPL添加自定义版本字段

  1. 打开BPL项目选项(Project -> Options)
  2. 切换到Version Info标签页
  3. 点击Add按钮,新增字符串类型项,名称设为CustomDescription,值填入包描述
  4. 保存并重新编译BPL

步骤2:主程序读取自定义版本字段

编写函数读取版本信息中的自定义字段:

function GetBPLCustomVersionField(const ABPLPath, FieldName: string): string;
var
  VerInfoSize: DWORD;
  pVerInfo: Pointer;
  pTrans: PWord;
  TransSize: DWORD;
  pValue: PChar;
  ValueSize: DWORD;
begin
  Result := '';
  // 获取版本信息大小
  VerInfoSize := GetFileVersionInfoSize(PChar(ABPLPath), nil);
  if VerInfoSize = 0 then Exit;
  GetMem(pVerInfo, VerInfoSize);
  try
    if not GetFileVersionInfo(PChar(ABPLPath), 0, VerInfoSize, pVerInfo) then Exit;
    // 获取语言和代码页信息
    if not VerQueryValue(pVerInfo, '\VarFileInfo\Translation', Pointer(pTrans), TransSize) then Exit;
    // 构造自定义字段查询路径并读取
    if VerQueryValue(pVerInfo, PChar(Format('\StringFileInfo\%0.4x%0.4x\%s',
      [pTrans[0], pTrans[1], FieldName])), Pointer(pValue), ValueSize) then
      Result := pValue;
  finally
    FreeMem(pVerInfo);
  end;
end;

调用示例:

ShowMessage(GetBPLCustomVersionField('AuthManage.bpl', 'CustomDescription'));

方案对比

  • 自定义资源:支持任意格式内容(如多语言描述、JSON配置),不受版本信息格式限制
  • 自定义版本字段:与标准版本信息统一管理,适合简单文本描述

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:43:18