Delphi XE6:如何枚举RCData资源名称?

时间:2018-04-22 07:30:18

标签: delphi embedded-resource enumeration

我已将多个资源嵌入到可执行文件中,例如语言(文本)文件。

您可以在下面看到Languages.rc文件的内容:

Language_English  RCDATA  Languages\English.ini
Language_German   RCDATA  Languages\German.ini
Language_Czech    RCDATA  Languages\Czech.ini

我找到this answer,这肯定有帮助,但是我很难实现它。

1 个答案:

答案 0 :(得分:0)

假设您想要将这些资源的列表作为EOL分隔的字符串,那么第一步就是定义EnumRCDataProc函数:

function EnumRCDataProc(hModule: HMODULE; lpszType, lpszName: PChar; lParam: NativeInt): BOOL; stdcall;
begin
  TStrings(lParam).Add(lpszName);
  Result := True;
end;

完成后,我们就可以开始工作了:

function EnumerateRCDataResourceNames: string;

var
  ExecutableHandle: HMODULE;
  ResourcesList: TStringList;

begin
  ExecutableHandle := LoadLibraryEx(PChar(Application.ExeName), 0, LOAD_LIBRARY_AS_DATAFILE);
  try
    ResourcesList := TStringList.Create;
    try
      EnumResourceNames(ExecutableHandle, RT_RCDATA, @EnumRCDataProc, NativeInt(ResourcesList));
      Result := ResourcesList.Text;
    finally
      ResourcesList.Free;
    end;
  finally
    FreeLibrary(ExecutableHandle);
  end;
end;

说明:

  • 与原始答案(请参阅问题)一样,不能使用LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVELOAD_LIBRARY_AS_IMAGE_RESOURCE,因为这些类型不再在Delphi XE6中定义,至少是AFAIK。< / p>

  • 但是,根据MSDN

    ,您可以定义这些常量
    • LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = $00000040
    • LOAD_LIBRARY_AS_IMAGE_RESOURCE = $00000020