Ajouter ou modifier une ressource icone dans un exécutable ou dll...

Description

Ce code permet de modifier ou d'ajouter une icone à un executable compilé ou à une dll.

Vous choisissez un fichier exe, un fichier ico, un langue d'icone, un ID de groupe (numérique), un ID d'icone (numérique), vous cliquez sur ajouter / modifier et l'icone est ajouter à l'exe choisi...

ce code ne permet pas de lister les icones contenues dans l'exe...peut être à venir...

Source / Exemple :


Option Explicit

'entete d'un fichier icone
Public Type ICONDIR
    idReserved As Integer   ' Reserved (must be 0)
    idType As Integer       ' Resource Type (1 for icons)
    idCount As Integer      ' How many images?
    'ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
End Type

'décrit chaque icone du fichier
Public Type ICONDIRENTRY
    bWidth As Byte          ' Width, in pixels, of the image
    bHeight As Byte         ' Height, in pixels, of the image
    bColorCount As Byte     ' Number of colors in image (0 if >=8bpp)
    bReserved As Byte       ' Reserved ( must be 0)
    wPlanes As Integer      ' Color Planes
    wBitCount As Integer    ' Bits per pixel
    dwBytesInRes As Long    ' How many bytes in this resource?
    dwImageOffset As Long   ' Where in the file is this image?
End Type

'entete de ressource groupe d'icone
Public Type GRPICONDIR
    idReserved As Integer   ' Reserved (must be 0)
    idType As Integer       ' Resource Type (1 for icons)
    idCount As Integer      ' How many images?
    'ICONDIRENTRY   idEntries[1]; // An entry for each image (idCount of 'em)
End Type

'décrit chaque ressource icone
Public Type GRPICONDIRENTRY
    bWidth As Byte          ' Width, in pixels, of the image
    bHeight As Byte         ' Height, in pixels, of the image
    bColorCount As Byte     ' Number of colors in image (0 if >=8bpp)
    bReserved As Byte       ' Reserved ( must be 0)
    wPlanes As Integer      ' Color Planes
    wBitCount As Integer    ' Bits per pixel
    dwBytesInRes As Long    ' How many bytes in this resource?
    dwIconID As Integer   ' Where in the file is this image?
End Type
'fichier de donnée
Public Type Dat
    ' des données
    Data() As Byte
End Type

'un fichier icone
Public Type Ico
    IcoDir As ICONDIR 'entete
    Entries() As ICONDIRENTRY 'decrit chaque icone
    IcoData() As Dat 'données
End Type

'une ressoure de groupe d'icones
Public Type IcoExe
    'décrit le groupe d'icones
    IcoDir As GRPICONDIR
    'décrit l'icone
    Entries() As GRPICONDIRENTRY
End Type

'obtient un  handle de modification de ressource
Private Declare Function BeginUpdateResource Lib "kernel32.dll" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
'met à jour des infos de ressource
Private Declare Function UpdateResource Lib "kernel32.dll" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
'enregistre des infos de ressource dans le fichier
Private Declare Function EndUpdateResource Lib "kernel32.dll" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
'copie une zone mémoire dans une autre
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

'ressource icone
'type Resource Icone
Private Const RT_ICON As Long = 3&
Private Const DIFFERENCE As Long = 11
'type groupe d'icones
Private Const RT_GROUP_ICON As Long = (RT_ICON + DIFFERENCE)

'ouvrir un fichier icone
'========================
'FileName : nom du fichier icone
'renvoie le contenu formatté du fichier icone
Public Function OpenIconFile(FileName As String) As Ico
Dim t As Ico 'structure temporaire
Dim X As Long 'compteur

'on ouvre le fichier
Open FileName For Binary As #1
    'on récupère l'entete du fichier
    Get #1, , t.IcoDir
    
    'redimensionne au nombre d'icones
    ReDim t.Entries(0 To t.IcoDir.idCount - 1)
    ReDim t.IcoData(0 To t.IcoDir.idCount - 1)
    
    'pour chaque icones
    For X = 0 To t.IcoDir.idCount - 1
        'récupère l'entete de l'icone
        Get #1, 6 + 16 * X + 1, t.Entries(X)
        'redimensionne à la taille des données
        ReDim t.IcoData(X).Data(t.Entries(X).dwBytesInRes - 1)
        'récupère les données
        Get #1, t.Entries(X).dwImageOffset + 1, t.IcoData(X).Data
    Next
'ferme le fichier
Close #1
'renvoie les données
OpenIconFile = t
End Function

'transforme un fichier icone en ressource icone et groupe d'icones
'=============================================
'IcoFile : structure formattée du fichier icone
'IDBase : ID de base des icones
'renvoie une structure ressource icone
Private Function MakeIcoExe(IconFile As Ico, IDBase As Long) As IcoExe
Dim t As IcoExe 'structure temporaire
Dim X As Long 'compteur

'nombre d'icones
t.IcoDir.idCount = IconFile.IcoDir.idCount
'type : Icone = 1
t.IcoDir.idType = 1
'chaque entrée
ReDim t.Entries(IconFile.IcoDir.idCount - 1)

'pour chaque entrée
For X = 0 To t.IcoDir.idCount - 1
    'entete d'icones
    t.Entries(X).bColorCount = IconFile.Entries(X).bColorCount
    t.Entries(X).bHeight = IconFile.Entries(X).bHeight
    t.Entries(X).bReserved = IconFile.Entries(X).bReserved
    t.Entries(X).bWidth = IconFile.Entries(X).bWidth
    t.Entries(X).dwBytesInRes = IconFile.Entries(X).dwBytesInRes
    t.Entries(X).dwIconID = X + IDBase
    t.Entries(X).wBitCount = IconFile.Entries(X).wBitCount
    t.Entries(X).wPlanes = IconFile.Entries(X).wPlanes
Next
'renvoie la structure
MakeIcoExe = t
End Function

'remplace l'icone du fichier
'===============================
'FileName : nom du fichier executable
'IcoFile : nom du fichier icone
'BaseID : ID de base de l'icone
'GroupID : ID du groupe d'icones
'LangID : ID de la langue de l'icone
Public Function ReplaceIcoInExe(FileName As String, IcoFile As Ico, BaseID As Long, GroupID As Long, LangID As Long) As Boolean
Dim hWrite As Long 'handle de modification
Dim Exe As IcoExe 'structure de ressource icone
Dim ret As Long 'valeur de retour
Dim X As Long 'compteur
Dim D() As Byte 'buffer

'obtient un handle de modification
hWrite = BeginUpdateResource(FileName, 0)

'si échec, on quitte
If hWrite = 0 Then ReplaceIcoInExe = False: Exit Function

'sinon, on lit l'icone
Exe = MakeIcoExe(IcoFile, BaseID)

'on redimmensionne le buffer
ReDim D(6 + 14 * Exe.IcoDir.idCount)
'on copie les données dans le buffer
CopyMemory ByVal VarPtr(D(0)), ByVal VarPtr(Exe.IcoDir), 6

'pour chaque icone
For X = 0 To Exe.IcoDir.idCount - 1
    'on copie les données
    CopyMemory ByVal VarPtr(D(6 + 14 * X)), ByVal VarPtr(Exe.Entries(X).bWidth), 14&
Next

'on met à jour la ressource groupe icone
ret = UpdateResource(hWrite, RT_GROUP_ICON, GroupID, LangID, ByVal VarPtr(D(0)), UBound(D))

'si échec, on quitte
If ret = 0 Then ReplaceIcoInExe = False: EndUpdateResource hWrite, 1: Exit Function

'on met à jour chaque ressource icone
For X = 0 To Exe.IcoDir.idCount - 1
    ret = UpdateResource(hWrite, RT_ICON, Exe.Entries(X).dwIconID, LangID, ByVal VarPtr(IcoFile.IcoData(X).Data(0)), Exe.Entries(X).dwBytesInRes)
Next

'on enregsitre dans le fichier executable
ret = EndUpdateResource(hWrite, 0)
'si échec, on quitte
If ret = 0 Then ReplaceIcoInExe = False: Exit Function

'sinon succès
ReplaceIcoInExe = True
End Function

Conclusion :


Testé sous XP

N'hésitez pas à commenter et à noter...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.