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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| {$REGION 'Modification des ressources'}
{---------------------------------}
{ Ajout-suppression de ressources }
{---------------------------------}
{$IFDEF MSWINDOWS}
{*
Débute la mise à jour des ressources d'un fichier module
Tout appel à BeginUpdateRes doit être compensé par un appel à EndUpdateRes.
@param FileName Nom du fichier module
@return Handle de ressources
*}
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;
{*
Ajoute une ressource
@param ResHandle Handle de ressources obtenu par BeginUpdateRes
@param ResName Nom de la ressource à ajouter
@param Resource Flux contenant la ressource
@param ResType Type de ressource
*}
procedure AddResource(ResHandle : integer; const ResName : string;
Resource : TStream; const ResType : string = '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;
{*
Supprime une ressource
@param ResHandle Handle de ressources obtenu par BeginUpdateRes
@param ResName Nom de la ressource à supprimer
*}
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;
{*
Termine la mise à jour des ressources d'un fichier module
@param ResHandle Handle de ressources obtenu par BeginUpdateRes
@param Cancel Indique s'il faut annuler les modifications faites
*}
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;
{*
Ajoute une ressources à un fichier module
@param FileName Nom du fichier module
@param ResName Nom de la ressource à ajouter
@param Resource Flux contenant la ressource
@param ResType Type de ressource
*}
procedure AddResToFile(const FileName, ResName : string; Resource : TStream;
const ResType : string = '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;
{*
Supprime une ressources d'un fichier module
@param FileName Nom du fichier module
@param ResName Nom de la ressource à supprimer
*}
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}
{$ENDREGION} |
Partager