[fpc-pascal] fcl-res: using resource embedded in exe

Reinier Olislagers reinierolislagers at gmail.com
Sat May 25 14:25:26 CEST 2013


Hi list,

I've noticed some code of mine using resources needed the windows unit
(to get RT_RCDATA), Iand therefore wasn't cross-platform.

Tried rewriting using fcl-res, which seems to work ok at least on Windows:
uses
  ,resource
  //resource readers
  ,resreader, coffreader, winpeimagereader, elfreader, machoreader
  //misc
  ,elfconsts, cofftypes, machotypes;
...
    Resources:=TResources.Create;
    ResourceStream:=TMemoryStream.Create;
    try
// ====>>>>>> problem here
      Resources.LoadFromFile(Paramstr(0)); //load from exe. Isn't there
a more elegant way of doing this?
// ====>>>>>> end of problem
      for ResourceCounter:=0 to Resources.Count-1 do
      begin
        // Make sure we get the correct resource (must match .rc values):
        if (Resources[ResourceCounter]._Type.Name='RCDATA') and
          (Resources[ResourceCounter].Name.Name='SQLSCRIPT') then
        begin
          ResourceStream.CopyFrom(Resources[ResourceCounter].RawData,
            Resources[ResourceCounter].RawData.Size);
          break;
        end;
      end;
      if ResourceStream.Size=0 then
        raise Exception.Create('Cannot load SQL script as a resource
from the executable.');

In the code above, I'm loading the resource from the executable.
However, Paramstr(0) is not reliable on all platforms.
Is there a better way of doing this?

Thanks,
Reinier



More information about the fpc-pascal mailing list