如何在运行时加载未嵌入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
相关产品推荐
相关产品推荐

