Search code examples
delphiembedded-resourceenumeration

Delphi XE6: How to enumerate RCData resource names?


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.


Solution

  • 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