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

如何在运行时加载未嵌入EXE的RES文件?

运行时加载独立RES文件的实现方法
  • 完全可以在运行时加载未嵌入EXE的RES文件,Delphi提供了原生API和VCL工具来实现这一需求。
  • 核心逻辑是通过系统API加载外部资源文件(编译后的RES本质是二进制资源模块,也可以将资源编译为独立DLL作为容器),再通过资源操作API提取其中的图像、字符串等数据。

直接加载RES文件的示例代码

var
  hResModule: THandle;
  hRes: THandle;
  pResData: Pointer;
  ResSize: DWORD;
begin
  // 加载外部RES文件(需确保是经RC编译的二进制资源文件)
  hResModule := LoadLibraryEx('external.res', 0, LOAD_LIBRARY_AS_DATAFILE);
  if hResModule <> 0 then
  try
    // 查找指定类型和名称的资源(示例为位图资源)
    hRes := FindResource(hResModule, 'MY_BITMAP', RT_BITMAP);
    if hRes <> 0 then
    begin
      ResSize := SizeofResource(hResModule, hRes);
      pResData := LockResource(LoadResource(hResModule, hRes));
      if pResData <> nil then
      begin
        // 此处处理资源数据,例如将位图数据加载到TBitmap
        // ...
        UnlockResource(pResData);
      end;
      FreeResource(hRes);
    end;
  finally
    FreeLibrary(hResModule);
  end;
end;

更简便的DLL资源容器方案

若想简化操作,可将资源编译为独立DLL,通过VCL的TResourceStream读取:

var
  ResStream: TResourceStream;
  Bitmap: TBitmap;
  hDll: THandle;
begin
  hDll := LoadLibrary('res_container.dll');
  if hDll <> 0 then
  try
    ResStream := TResourceStream.CreateFromID(hDll, 101, RT_BITMAP);
    try
      Bitmap := TBitmap.Create;
      try
        Bitmap.LoadFromStream(ResStream);
        // 处理加载后的位图资源
      finally
        Bitmap.Free;
      end;
    finally
      ResStream.Free;
    end;
  finally
    FreeLibrary(hDll);
  end;
end;

注意事项

  • 外部RES文件必须是经RC编译的二进制文件,不能是未编译的文本格式RC文件。
  • 字符串资源、图标等其他类型资源的提取逻辑类似,只需替换对应的资源类型标识(如RT_STRING、RT_ICON)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:03:10