Habe aus Langeweile mal eine kleine Demo gebastelt (vollständiger Code & Kompilat im Anhang).
Delphi-Quellcode:
type
TResourceDataClass = class of TResourceData;
TResourceData = class(TdxDataContainer)
end;
TdxDataContainer ist eine kleine Klasse von mir, welche 2 abstrakte Methoden LoadFromStream() und SaveToStream() enthält, die in jeder Unterklasse implementiert werden müssen.
Folgende Funktion wird zum Schreiben der Daten verwendet:
Delphi-Quellcode:
function WriteResource(Filename: String; lpName: PChar; lpType: PChar;
wLanguage: Word; ResourceData: TResourceData): Boolean;
var
MS: TMemoryStream;
hUpdate: THandle;
begin
Result := false;
MS := TMemoryStream.Create;
try
ResourceData.SaveToStream(MS);
MS.Position := 0;
hUpdate := BeginUpdateResource(PChar(Filename), false);
if (hUpdate <> 0) and (hUpdate <> INVALID_HANDLE_VALUE) then
try
Result := UpdateResource(hUpdate, lpType, lpName, wLanguage,
MS.Memory, MS.Size);
finally
Result := Result and EndUpdateResource(hUpdate, false);
end;
finally
MS.Free;
end;
end;
Das Auslesen funktioniert folgendermaßen:
Delphi-Quellcode:
function ReadResource(hInstance: HINST; lpName: PChar; lpType: PChar;
ResourceDataClass: TResourceDataClass): TResourceData;
var
RS: TResourceStream;
begin
Result := nil;
if not ResourceExists(hInstance, lpName, lpType) then Exit;
RS := TResourceStream.Create(hInstance, lpName, lpType);
try
RS.Position := 0;
Result := ResourceDataClass.Create;
Result.LoadFromStream(RS);
finally
RS.Free;
end;
end;