UDF > WinAPIEx > Menus & Resources > Resources >


_WinAPI_UpdateResource

Ajoute, supprime ou remplace une ressource dans un fichier exécutable portable (PE)

#include <WinAPIRes.au3>
_WinAPI_UpdateResource ( $hUpdate, $sType, $sName, $iLanguage, $pData, $iSize )

Paramètres

$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.

Valeur de retour

Succès: Retourne True.
Échec: Retourne False.

Remarques

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.

En relation

_WinAPI_BeginUpdateResource, _WinAPI_EndUpdateResource, _WinAPI_LoadIcon, _WinAPI_LoadString

Voir aussi

Consultez UpdateResource 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