Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AJOUTER OU MODIFIER UNE RESSOURCE ICONE DANS UN EXÉCUTABLE OU DLL...


Information sur la source

Catégorie :Fichier / Disque Niveau : Initié Date de création : 11/12/2004 Vu / téléchargé: 8 946 / 941

Note :
9,75 / 10 - par 4 personnes
9,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note


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

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

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de DARKSIDIOUS le 11/12/2004 20:51:12 administrateur CS

Très intéressant cette source, je sens que je vais pouvoir m'en servir pour mon éditeur d'icône. Pourrais-je ?

DarK Sidious

signaler à un administrateur
Commentaire de EBArtSoft le 11/12/2004 21:46:01 administrateur CS

Marche seulement sur platforme NT

@+

signaler à un administrateur
Commentaire de ShareVB le 12/12/2004 16:41:42

salut

si on veut utiliser cette source sur 9x, il faut utiliser par exemple le code suivant dans une dll C/C++ : http://www.codeguru.com/Cpp/misc/misc/article.php/c3909

tout le monde peut se servir de ma source...avec une petite référence à ma source quand même :)...

ShareVB

signaler à un administrateur
Commentaire de DARKSIDIOUS le 12/12/2004 17:15:30 administrateur CS

Oh t'en fait pas pour cà, si je me sert de ta source pour faire une option de mon éditeur d'icône, je te citerais, il n'y a pas de problème ;)

Merci beaucoup pour cette source instructive.

DarK Sidious

signaler à un administrateur
Commentaire de sam013 le 12/12/2004 18:44:13

Nikel 10/10

signaler à un administrateur
Commentaire de NBhack le 11/02/2005 14:16:06

merci

signaler à un administrateur
Commentaire de SuperPit37 le 01/06/2005 17:24:37

Je vais surement passer pour un con mais comment je fait pour trouver:  une langue d'icone, une ID de groupe (numérique), une ID d'icone (numérique),???

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.