0

I have embedded several resources into the executable, for instance language (text) files.

Below you can see the contents of Languages.rc file:

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

I found this answer, which definitely helps, however I have rather hard time implementing it.

Vlastimil Burián
  • 3,024
  • 2
  • 31
  • 52

1 Answers1

1

Suppose you want to get the list of those resources as a EOL-delimited string, then the first step would be defining EnumRCDataProc function:

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

Once we have that done, we can get to work:

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;

Remarks:

  • As is in the original answer (see question), it is not possible to use LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE or LOAD_LIBRARY_AS_IMAGE_RESOURCE as these types are no longer defined in Delphi XE6, at least AFAIK.

  • You can, however, define those constants, according to MSDN:

    • LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = $00000040
    • LOAD_LIBRARY_AS_IMAGE_RESOURCE = $00000020
Vlastimil Burián
  • 3,024
  • 2
  • 31
  • 52