Ajoute, supprime ou remplace une ressource dans un fichier exécutable portable (PE)
#include <WinAPIRes.au3>
_WinAPI_UpdateResource ( $hUpdate, $sType, $sName, $iLanguage, $pData, $iSize )
$hUpdate | Le handle du module retourné par _WinAPI_BeginUpdateResource() , en référençant le fichier à mettre à jour. |
$sType | Le type de ressource à mettre à jour. Alternativement, plutôt qu'un pointeur, ce paramètre peut prendre une valeur entière représentant un type de ressource prédéfini. Si le premier caractère de la chaîne est le signe dièse (#), puis les caractères restants représentent un nombre décimal qui spécifie l'identifiant entier du type de ressource. Par exemple, la chaîne "#258" représente l'identifiant 258. Vous pouvez aussi utiliser un des types de ressources prédéfinis ($RT_*). |
$sName | Le nom de la ressource qui doit être mise à jour. Ce paramètre peut être une chaîne ou une valeur entière. |
$iLanguage | L'identifiant de la langue de la ressource. |
$pData | Les données sur les ressources à insérer dans le fichier indiquées par le paramètre $hUpdate. Si la ressource est d'un des types prédéfinis, les données doivent être valides et correctement alignées. Notez que ce sont des données binaires brutes, pas des données fournies par _WinAPI_LoadIcon(), _WinAPI_LoadString(), ou d'autres fonctions qui chargent des ressources spécifiques. Toutes les données contenant des chaînes ou du texte doivent être au format Unicode. Si $pData est 0 et $iSize est 0, la ressource spécifiée est supprimée du fichier indiqué par $hUpdate. |
$iSize | La taille, en octets, des données de ressource à la position $pData. |
Succès: | Retourne True. |
Échec: | Retourne False. |
Il est recommandé de ne pas charger le fichier de ressources avant que cette fonction soit appelée. Toutefois, si ce fichier est déjà chargé, la fonction ne retournera pas une erreur.
Une application peut utiliser _WinAPI_UpdateResource() à plusieurs reprises pour apporter des modifications aux données de ressource. Chaque appel à _WinAPI_UpdateResource() contribue à une liste interne des ajouts, des suppressions et des remplacements, mais n'écrit pas réellement les données dans le fichier. L'application doit utiliser la fonction _WinAPI_EndUpdateResource() pour écrire les changements accumulés.
Si $pData est 0 et $iSize est 0, la ressource spécifiée est supprimée du fichier indiqué par $hUpdate.
_WinAPI_BeginUpdateResource, _WinAPI_EndUpdateResource, _WinAPI_LoadIcon, _WinAPI_LoadString
Consultez UpdateResource dans la librairie MSDN.
#include <APIResConstants.au3> #include <MsgBoxConstants.au3> #include <WinAPIFiles.au3> #include <WinAPIHObj.au3> #include <WinAPIRes.au3> Global Const $g_sExe = @TempDir & '\MyProg.exe' Global Const $tagICONRESDIR = 'byte Width;byte Height;byte ColorCount;byte Reserved;ushort Planes;ushort BitCount;dword BytesInRes;ushort IconId;' Global Const $tagNEWHEADER = 'ushort Reserved;ushort ResType;ushort ResCount;' ; & $tagICONRESDIR[ResCount] ; Sélectionne l'icône à mettre à jour dans la ressource Local $sIcon = FileOpenDialog('Select File', @ScriptDir & '\Extras', 'Icon Files (*.ico)', 1 + 2, 'Script.ico') If Not $sIcon Then Exit EndIf ; Crée un fichier exécutable simple (monprog.exe) dans lequel l'icône sera ajoutée If Not FileCopy(@ScriptDir & '\Extras\MyProg.exe', $g_sExe, $FC_OVERWRITE) Then If MsgBox(BitOR($MB_OKCANCEL, $MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Impossible de copier MyProg.exe ou le fichier existe déjà dans le répertoire courant.') <> 1 Then Exit EndIf FileCopy(@ScriptDir & '\Extras\MyProg.exe', $g_sExe, $FC_OVERWRITE) EndIf Local $iError = 1 Do ; Commence la mise à jour de la ressource Local $hUpdate = _WinAPI_BeginUpdateResource($g_sExe) If @error Then ExitLoop EndIf ; Lit le fichier .ico comme des données binaires brutes dans la structure Local $tIcon = DllStructCreate('ushort Reserved; Type de ushort; ushort comte; byte [ '& (FileGetSize ($SiCon) - 6) et '] ') Local $pIcon = DllStructGetPtr($tIcon) Local $hFile = _WinAPI_CreateFile($sIcon, 2, 2) If Not $hFile Then ExitLoop EndIf Local $iBytes = 0 _WinAPI_ReadFile($hFile, $pIcon, DllStructGetSize($tIcon), $iBytes) _WinAPI_CloseHandle($hFile) If Not $iBytes Then ExitLoop EndIf ; Ajoute toutes les icônes du fichier .ico dans les ressources RT_ICON identifiées comme 400, 401, etc..., et remplit la structure du groupe d'icônes Local $iCount = DllStructGetData($tIcon, 'Count') Local $tDir = DllStructCreate($tagNEWHEADER & 'byte['& (14 * $iCount) & ']') Local $pDir = DllStructGetPtr($tDir) DllStructSetData($tDir, 'Reserved', 0) DllStructSetData($tDir, 'ResType', 1) DllStructSetData($tDir, 'ResCount', $iCount) Local $tInfo, $iSize, $tData, $iID = 400 For $i = 1 To $iCount $tInfo = DllStructCreate('byte Width;byte Heigth;byte Colors;byte Reserved;ushort Planes;ushort BPP;dword Size;dword Offset', $Picon + 6 + 16 * ($i - 1)) $iSize = DllStructGetData($tInfo, 'Size') If Not _WinAPI_UpdateResource($hUpdate, $RT_ICON, $iID, 0, $pIcon + DllStructGetData($tInfo, 'Offset'), $iSize) Then ExitLoop 2 EndIf $tData = DllStructCreate($tagICONRESDIR, $pDir + 6 + 14 * ($i - 1)) DllStructSetData($tData, 'Width', DllStructGetData($tInfo, 'Width')) DllStructSetData($tData, 'Height', DllStructGetData($tInfo, 'Heigth')) DllStructSetData($tData, 'ColorCount', DllStructGetData($tInfo, 'Colors')) DllStructSetData($tData, 'Reserved', 0) DllStructSetData($tData, 'Planes', DllStructGetData($tInfo, 'Planes')) DllStructSetData($tData, 'BitCount', DllStructGetData($tInfo, 'BPP')) DllStructSetData($tData, 'BytesInRes', $iSize) DllStructSetData($tData, 'IconId', $iID) $iID += 1 Next ; Ajoute nouvelle ressource RT_GROUP_ICON nommé "MAINICON" If Not _WinAPI_UpdateResource($hUpdate, $RT_GROUP_ICON, 'MAINICON', 0, $pDir, DllStructGetSize($tDir)) Then ExitLoop EndIf $iError = 0 Until 1 ; Enregistre ou annule les modifications des ressources dans un fichier exécutable If Not _WinAPI_EndUpdateResource($hUpdate, $iError) Then $iError = 1 EndIf ; Affiche le message en cas d'erreur If $iError Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Erreur', 'Impossible de modifier les ressources.') EndIf