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添加自定义版本字段
- 打开BPL项目选项(
Project -> Options) - 切换到
Version Info标签页 - 点击
Add按钮,新增字符串类型项,名称设为CustomDescription,值填入包描述 - 保存并重新编译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
相关产品推荐
相关产品推荐

