1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| {$IFDEF MSWINDOWS}
function BeginUpdateRes(const FileName : string) : integer;
begin
// Appel de Windows.BeginUpdateResource
Result := BeginUpdateResource(PChar(FileName), False);
// Si Result = 0, il y a eu une erreur API
if Result = 0 then
raise EUpdateResError.Create;
end;
procedure AddResource(ResHandle : integer; const ResName : string;
Resource : TStream; const ResType : string = 'RT_RCDATA');
var MemRes : TMemoryStream;
MustFreeRes, OK : boolean;
begin
MustFreeRes := False;
// On met dans MemRes un flux mémoire qui contient les données de la ressource
if Resource is TMemoryStream then MemRes := Resource as TMemoryStream else
begin
MemRes := TMemoryStream.Create;
MemRes.LoadFromStream(Resource);
MustFreeRes := True;
end;
// Appel de Windows.UpdateResource
OK := UpdateResource(ResHandle, PChar(ResType), PChar(ResName), 0,
MemRes.Memory, MemRes.Size);
// On supprime le flux mémoire si on l'a créé
if MustFreeRes then MemRes.Free;
// Si UpdateResource a renvoyé False, il y a eu une erreur
if not OK then raise EUpdateResError.Create;
end;
procedure DelResource(ResHandle : integer; const ResName : string);
begin
// Appel de Windows.UpdateResource
if not UpdateResource(ResHandle, '', PChar(ResName), 0, nil, 0) then
// Si UpdateResource a renvoyé False, il y a eu une erreur
raise EUpdateResError.Create;
end;
procedure EndUpdateRes(ResHandle : integer; Cancel : boolean = False);
begin
// Appel de Windows.EndUpdateResource
if not EndUpdateResource(ResHandle, Cancel) then
// Si EndUpdateResource a renvoyé False, il y a eu une erreur
raise EUpdateResError.Create;
end;
procedure AddResToFile(const FileName, ResName : string; Resource : TStream;
const ResType : string = 'RT_RCDATA');
var ResHandle : integer;
begin
ResHandle := BeginUpdateRes(FileName);
try
AddResource(ResHandle, ResName, Resource, ResType);
EndUpdateRes(ResHandle);
except
try EndUpdateRes(ResHandle, True) except end;
raise;
end;
end;
procedure DelResInFile(const FileName, ResName : string);
var ResHandle : integer;
begin
ResHandle := BeginUpdateRes(FileName);
try
DelResource(ResHandle, ResName);
EndUpdateRes(ResHandle);
except
try EndUpdateRes(ResHandle, True) except end;
raise;
end;
end;
{$ENDIF} |
Partager