Uralt und funzt immernoch:
Delphi-Quellcode:
function ExtractResTo(Instance: hInst; BinResName, NewPath, ResType:
string):
boolean;
(*******************************************************************************
Function: ExtractResTo
Returns: Boolean (true=success)
Version: Function version 3.0
Parameters
Instance: is the instance handle of the module containing the resource. if not
current module, use LLoadLibrary() and FreeLibrary() to load and free
the module containing the resource.
BinResName: is the name of the resource to extract. this would even work with
icons, cursors, texts, yaddayadda ...
NewPath: path of the file to create from the resource (where to put the
file)
ResType: resource type. pre-defined values can be found in Windows.pas
e.g. RT_RCDATA
*******************************************************************************)
var
ResSize,
HG,
HI,
SizeWritten,
hFileWrite: Cardinal;
begin
result := false;
HI := FindResource(Instance, @binresname[1], @ResType[1]);
if HI <> 0
then begin
HG := LoadResource(Instance, HI);
if HG <> 0
then
try
ResSize := SizeOfResource(Instance, HI);
hFileWrite := CreateFile(@newpath[1], GENERIC_READ
or GENERIC_WRITE,
FILE_SHARE_READ
or FILE_SHARE_WRITE,
nil, CREATE_ALWAYS,
FILE_ATTRIBUTE_ARCHIVE, 0);
if hFileWrite <> INVALID_HANDLE_VALUE
then
try
result := (WriteFile(hFileWrite, LockResource(HG)^, ResSize,
SizeWritten,
nil)
and (SizeWritten = ResSize));
finally
CloseHandle(hFileWrite);
end;
except;
end;
end;
end;
siehe auch
hier und
ExtractResTo sowie
PutBinResTo ...
Übrigens sind selbst Delphi-Strings (AnsiString, LongString, WideString) keine nullterminierten Zeichenketten, somit ist es absolut irrelevant für die Funktion ob die zu extrahierenden Daten nun Text sind oder nicht. Man kann sich auch gut vorstellen eine Liste von nullterminierten Strings als Ressource einzubinden, oder?!
Auch für Strings habe ich schon vor Jahren was geschrieben, finde es aber im Moment nicht. Ist aber sowieso nur eine Modifikation des ursprünglichen Codes der obigen Funktion gewesen.
Übrigens lautet die Konstante ja auch: RT_RCDATA, nur mal so ...
Denn wie wir alle wissen ist RT_RCDATA wie folgt deklariert:
Code:
#define RT_RCDATA MAKEINTRESOURCE(10)
oder delphianisch:
const RT_RCDATA = PChar(10);