juste pour info, dans les exe, dll, icl, ocx (et tout ce qui a des icônes en ressources (format 32 bit = format PE), les icônes n'ont pas à proprement parler un index (ou position) mais un identifiant numérique ou alphanumériques (d'ou l'utilisation de IS_INTRESOURCE() et MAKEINTRESOURCE(). Cet identifiant est différent de 0 et les valeurs des identifiants ne se suivent pas forcément.
Soit tu connais l'identifiant et là avec ton code simplifié (en espérant que les identifiants ne soient que numériques) c'est bon, soit tu ne connais pas et c'est généralement le cas, car shell32.dll ne contient pas les mêmes icônes en fonctions des OS(et/ou version).
D'ou les API de microsoft permettant d'énumérer les éléments icônes en ressource, c'est cette version que j'ai mis sur le forum, ce n'est pas vraiment compliqué, il y a une callback qui est appelée par l'API windows et qui transmet les infos nécessaires pour obtenir les icônes.
Récupérer icône 48*48
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
oui, j'ai trouvé, voici ce que je voulais très exactement
Je continue ma petite librairie pour utiliser tout cela facielement
Je continue ma petite librairie pour utiliser tout cela facielement
Code : Tout sélectionner
EnableExplicit
#Return_Error = 0
; Utilisé pour charger une Dll, ICL, EXE en datafile (non executable)
#LOAD_LIBRARY_AS_DATAFILE = 2
Structure IconFind
Size.l
hIcon.i
EndStructure
Macro HIWORD(Value)
(Value>>16)
EndMacro
Macro LOWORD(Value)
Value & $FFFF
EndMacro
Macro MAKEINTRESOURCE(INT)
LOWORD(INT)
EndMacro
Macro IS_INTRESOURCE(Val)
HIWORD(Val)
EndMacro
Global NewList Icon_Liste()
; ici commence la callback utilisé pour compter les icônes des DLL/EXE 32 bits
; here start callback used to count up DLL/EXE 32 bits icons
Procedure.l Enumerate_Icon(hModule, lpszType, lpszName, *Icon.IconFind)
Static compteur, X_Position, Y_Position
; la fonction énumère les identifiants des d'icônes et pas des groupes d'icônes
; mémorise le handle du bloc d'information de la ressource recherchée
Protected Find_Resource = 0
; mémorise le handle du bloc d'information des données de la ressource chargée
Protected LoadResource = 0
; mémorise le pointeur sur le premier octet de la ressource retournée par LockResource_()
Protected *lpIconesource.BITMAPINFOHEADER = 0
If IS_INTRESOURCE(lpszName)
*Icon\hIcon = LoadImage_(hModule, PeekS(lpszName), #IMAGE_ICON, *Icon\Size, *Icon\Size, 0)
Else
*Icon\hIcon = LoadImage_(hModule, lpszName, #IMAGE_ICON, *Icon\Size, *Icon\Size, 0)
EndIf
If *Icon\hIcon
AddElement(Icon_Liste())
Icon_Liste() = *Icon\hIcon
If compteur = 0
X_Position = 4
Y_Position = - *Icon\Size
ElseIf ((*Icon\Size + 4) * (compteur + 1)) > WindowHeight(0)
compteur = 0
X_Position + *Icon\Size + 4
Y_Position = - *Icon\Size
EndIf
Y_Position + *Icon\Size + 4
ImageGadget(#PB_Any, X_Position, Y_Position, *Icon\Size, *Icon\Size, *Icon\hIcon)
compteur + 1
ProcedureReturn #True ; on stoppe l'énumération
EndIf
ProcedureReturn #True ; #true pour continuer l'opération
EndProcedure
Procedure.l Create_Icon_From_EXEFile(szFileName$, Size)
; mémorise le handle de l'exe ou dll ouvert
Protected hLibrary = 0
; mémorise les données propres à l'icone
Protected IconData.IconFind
; Load the DLL/EXE-NOTE : must be a 32bit EXE/DLL For this To work
; Charge Le fichier DLL/EXE, doit être au format PE (32 bits) pour fonctionner
hLibrary = LoadLibraryEx_(szFileName$, #NULL, #LOAD_LIBRARY_AS_DATAFILE)
If hLibrary = #NULL
; //Failed To load-abort
; Impossible de charger le module, on quitte
Debug "Unable to load exe file/Impossible de charger le fichier exe"
ProcedureReturn #Return_Error
EndIf
IconData\Size = Size
; enumerate icons in ressource
EnumResourceNames_(hLibrary, #RT_GROUP_ICON, @Enumerate_Icon(), @IconData)
; libère les ressources
FreeLibrary_(hLibrary)
ProcedureReturn IconData\hIcon
EndProcedure
If OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
Create_Icon_From_EXEFile("shell32.dll", 32)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
;// destruction des icônes
ForEach Icon_Liste()
DestroyIcon_(Icon_Liste())
Next
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]