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

Delphi XE6: How to enumerate RCData resource names?

我在可执行文件中嵌入了几个资源,例如语言(文本)文件。

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

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

我找到了 this answer,这绝对有帮助,但我很难实现它。

假设您想要获取这些资源的列表作为以 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,因为这些类型不再在 [=44= 中定义] XE6,至少AFAIK.

  • 但是,您可以根据 MSDN:

    定义这些常量
    • LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = [=16=]000040
    • LOAD_LIBRARY_AS_IMAGE_RESOURCE = [=18=]000020