Récupérer icône 48*48

Programmation d'applications complexes
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

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.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oui, j'ai trouvé, voici ce que je voulais très exactement

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)]
Répondre