Obtient le handle qui peut être utilisé pour ajouter, supprimer ou remplacer des ressources dans un module binaire
#include <WinAPIRes.au3>
_WinAPI_BeginUpdateResource ( $sFilePath [, $bDelete = False] )
$sFilePath | Le fichier binaire dans lequel effectuer la mise à jour des ressources. Une application doit être en mesure d'obtenir un accès en écriture à ce fichier; le fichier référencé par $sFilePath ne peut pas être en cours d'exécution. |
$bDelete |
[optionnel] Spécifie s'il faut supprimer les ressources existantes, les valeurs valides sont: True - Les ressources sont supprimées et le fichier mis à jour comprend seulement les ressources ajoutées avec la fonction _WinAPI_UpdateResource(). False - Le fichier mis à jour comprend les ressources existantes (par défaut). |
Succès: | Retourne le handle pouvant être utilisé par la fonction _WinAPI_UpdateResource() et _WinAPI_EndUpdateResource(). |
Échec: | Retourne 0, appelez _WinAPI_GetLastError() pour obtenir des informations sur l'erreur. |
Il est recommandé de veiller à ce que le fichier de ressources ne soit pas chargé avant d'appeler cette fonction. Toutefois, si ce fichier est déjà chargé, elle ne retournera pas une erreur.
_WinAPI_EndUpdateResource, _WinAPI_UpdateResource
Consultez BeginUpdateResource 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;ushort Type;ushort Count;byte[' & (FileGetSize($sIcon) - 6) & ']') 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