UDF > WinAPIEx > Menus & Resources > Resources >


_WinAPI_EndUpdateResource

Enregistre ou annule des modifications de ressource dans un module

#include <WinAPIRes.au3>
_WinAPI_EndUpdateResource ( $hUpdate [, $bDiscard = False] )

Paramètres

$hUpdate Le handle du module retourné par la fonction _WinAPI_BeginUpdateResource(), et utilisé par _WinAPI_UpdateResource(), en référençant le fichier à mettre à jour.
$bDiscard [optionnel] Spécifie s'il faut écrire les mises à jour de la ressource dans le fichier, les valeurs valides sont:
    True - Les modifications sont annulées.
    False - Les modifications sont apportées: les mises à jour de la ressource prendront effet (par défaut).

Valeur de retour

Succès: Retourne True.
Échec: Retourne False, appelez _WinAPI_GetLastError() pour obtenir des informations sur l'erreur.

En relation

_WinAPI_BeginUpdateResource

Voir aussi

Consultez EndUpdateResource dans la librairie MSDN.

Exemple

#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