Récupérer icône 48*48

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Récupérer icône 48*48

Message par Le Soldat Inconnu »

Salut,

aie, le beau truc bien chiant.

Je cherche a choper les icônes 48*48 de n'importe quel fichier. mais ça à l'air d'être un peu trop chiadé pour moi. Si quelqu'un peut me filer un coup de main.

j'ai trouvé ce code en exemple, c'est pas du PB

Code : Tout sélectionner

#include <shlobj.h>
#include <shlguid.h>
#include <shellapi.h>
#include <commctrl.h>
#include <commoncontrols.h>

// Get the icon index using SHGetFileInfo
SHFILEINFOW sfi = {0};
SHGetFileInfo(filePath, -1, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX);

// Retrieve the system image list.
// To get the 48x48 icons, use SHIL_EXTRALARGE
// To get the 256x256 icons (Vista only), use SHIL_JUMBO
HIMAGELIST* imageList;
HRESULT hResult = SHGetImageList(SHIL_EXTRALARGE, IID_IImageList, (void**)&imageList);

if (hResult == S_OK) {
  // Get the icon we need from the list. Note that the HIMAGELIST we retrieved
  // earlier needs to be casted to the IImageList interface before use.
  HICON hIcon;
  hResult = ((IImageList*)imageList)->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hIcon);

  if (hResult == S_OK) {
    // Do something with the icon here.
    // For example, in wxWidgets:
    wxIcon* icon = new wxIcon();
    icon->SetHICON((WXHICON)hIcon);
    icon->SetSize(48, 48);
  }
}
Donc j'ai commencé à traduire mais ça plante méchamment

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Récupérer une icône de la taille 16*16, 32*32, 48*48

#SHIL_EXTRALARGE = $2

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

IconPath.s = "c:\"
SHGetFileInfo_(IconPath, -1, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX)
dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
If dll_Shell32
  hResult = CallFunction(dll_Shell32, "SHGetImageList", #SHIL_EXTRALARGE, IID_IImageList, @ImageList)
  If hResult = 0
    Debug "ok"
    
  EndIf
EndIf


ImageGadget(0, 0, 0, 48, 48, Icone)

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

If Icone
  DestroyIcon_(Icone)
EndIf
Votre aide est la bienvenue

pour info, récupérer du 16*16 ou 32*32 est bien plus simple. Voilà ce que j'utilise

Code : Tout sélectionner

ProcedureDLL.l GetSmallIconFile(IconPath.s) ; Extraire l'icône 16*16 d'un fichier
  ; Cette procedure permet d'extraire l'ID de l'icône 16*16 associé au type de fichier ou au dossier dont l'adresse est IconPath
  Extension.s = LCase(GetExtensionPart(IconPath))
  If Extension = "ico" Or Extension = "exe"
    ExtractIconEx_(IconPath, IconIndex, 0, @SmallIcon, 1)
    ProcedureReturn SmallIcon
  Else
    SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_SMALLICON)
    ProcedureReturn InfosFile\hIcon
  EndIf
EndProcedure
ProcedureDLL.l GetLargeIconFile(IconPath.s) ; Extraire l'icône 32*32 d'un fichier
  ; Cette procedure permet d'extraire l'ID de l'icône 32*32 associé au type de fichier ou au dossier dont l'adresse est IconPath
  Extension.s = LCase(GetExtensionPart(IconPath))
  If Extension = "ico" Or Extension = "exe"
    ExtractIconEx_(IconPath, IconIndex, @LargeIcon, 0, 1)
    ProcedureReturn LargeIcon
  Else
    SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON | #SHGFI_LARGEICON)
    ProcedureReturn InfosFile\hIcon
  EndIf
EndProcedure
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oula, il y a une histoire d'interface.

Et ce truc, je n'y comprend pas grand chose.
voir un autre exemple ici
http://www.vbaccelerator.com/home/net/c ... rticle.asp
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

hé, j'y arrive avec mon interface 8)
Enfin presque, visiblement, j'ai un problème dans la déclaration de mon interface. Et je fais comment moi

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Récupérer une icône de la taille 16*16, 32*32, 48*48


#SHIL_EXTRALARGE = $2

DataSection
IID_IImageList:
Data.l $46EB5926
Data.w $582E,$4017
Data.b $9F,$DF,$E8,$99,$8D,$AA,$09,$50
EndDataSection 



; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

IconPath.s = "c:\"
SHGetFileInfo_(IconPath, -1, @FileInfo.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX)
dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
If dll_Shell32
  *Guid = ?IID_IImageList
  hResult = CallFunction(dll_Shell32, "SHGetImageList", #SHIL_EXTRALARGE, *Guid, @ImageList.IImageList)
  If hResult = 0
    Debug "ok SHGetImageList"
    hResult = ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon)
    If hResult = 0
      Debug "ok GetIcon"
    EndIf
  EndIf
EndIf


ImageGadget(0, 0, 0, 48, 48, hIcon)

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

If Icone
  DestroyIcon_(hIcon)
EndIf
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

alors vla l'interface mais ça ne marche pas

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Récupérer une icône de la taille 16*16, 32*32, 48*48


#SHIL_EXTRALARGE = $2

DataSection
IID_IImageList:
Data.l $46EB5926
Data.w $582E,$4017
Data.b $9F,$DF,$E8,$99,$8D,$AA,$09,$50
EndDataSection 
Structure IMAGELISTDRAWPARAMS
  cbSize.l
  himl.l
  i.l
  hdcDst.l
  x.l
  y.l
  cx.l
  cy.l
  xBitmap.l
  yBitmap.l
  rgbBk.l
  rgbFg.l
  fStyle.l
  dwRop.l
  fState.l
  frame.l
  crEffect.l
EndStructure
Interface IImageList2
  
  Add(hbmImage, hbmMask, pi)
  ReplaceIcon(i, hIcon, pi)
  SetOverlayImage(iImage, iOverlay)
  Replace(i, hbmImage, hbmMask)
  AddMasked(hbmImage, crMask, pi)
  Draw(pimldp.IMAGELISTDRAWPARAMS)
  Remove(i)
  GetIcon(i, flags, picon)
  GetImageInfo(i, pImageInfo.IMAGEINFO)
  Copy(iDst, punkSrc.IImageList, iSrc, uFlags)
  Merge(i1, punk2.IImageList, i2, dx, dy, riid, ppv)
  Clone(riid, ppv)
  GetImageRect(i, prc.RECT)
  GetIconSize(cx, cy)
  SetIconSize(cx, cy)
  GetImageCount(pi)
  SetImageCount(uNewCount)
  SetBkColor(clrBk, pclr)
  GetBkColor(pclr)
  BeginDrag(iTrack, dxHotspot, dyHotspot)
  EndDrag()
  DragEnter(hwndLock, x, y)
  DragLeave(hwndLock)
  DragMove(x, y)
  SetDragCursorImage(punk.IImageList, iDrag, dxHotspot, dyHotspot)
  DragShowNolock(fShow)
  GetDragImage(ppt.POINT, pptHotspot.POINT, riid, ppv)
  GetItemFlags(i, dwFlags)
  GetOverlayImage(iOverlay, piIndex)
EndInterface

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

IconPath.s = "c:\"
SHGetFileInfo_(IconPath, 0, @FileInfo.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX)
Debug FileInfo\iIcon
dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
If dll_Shell32
  *Guid = ?IID_IImageList
  hResult = CallFunction(dll_Shell32, "SHGetImageList", #SHIL_EXTRALARGE, *Guid, @ImageList.IImageList2)
  If hResult = 0
    Debug "ok SHGetImageList"
    hResult = ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon)
    If hResult = 0
      Debug "ok GetIcon"
    EndIf
  EndIf
EndIf

Debug hIcon
ImageGadget(0, 0, 0, 48, 48, hIcon)

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

If Icone
  DestroyIcon_(hIcon)
EndIf
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Voilà un code que j'ai modifié que j'ai mis sur le forum il y a quelque temps, la taille recherchée est dans l'appel de la fonction, on peut mettre la valeur voulue. On peut adapter le code pour la profondeur des couleurs. Sous Vista, ça ouvre bien les icônes compressées, si tu as besoin d'un code pour créer une icône affichable sous XP, W2000 etc d'une icône compressée Vista, je te donnerais un code, sachant que les OS antérieurs à XP ne supportent pas la transparence partielle.

Seuls les icônes 256 x 256 sont compressées (norme MS) mais on trouve de tout avec des compressions pour des tailles inférieures.

Il fonctionne pour les dll, exe, cpl, icl, ocx (tout ce qui a des icônes en ressource) au format 32 bits (PE).

Ta dll comportant énormément d'icônes 48,48, je n'affiche pas tout, la fenêtre n'est pas assez grande.

Je pense que j'ai peut-être inversé la macro MAKEINTRESOURCE mais ça marche aussi comme ça.

Si tu as besoin du format ico, je ferais un code (faut pas être trop pressé).

Si tu as besoin du format icl au format 16 bits (NE), je ferais un code (faut être encore moins pressé ...).

C'est un code à l'arrache, alors à toi de bien supprimer les icônes etc.

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)
          ; c'est un pointeur sur une chaîne
          Find_Resource = FindResource_(hModule, PeekS(lpszName), #RT_ICON)
     Else
          ; c'est une valeur non un pointeur
          Find_Resource = FindResource_(hModule, MAKEINTRESOURCE(lpszName), #RT_ICON)
     EndIf
     
     
     ; l'API a échouée ? si oui on quitte, on passe au suivant
     If Find_Resource = #Null
          ProcedureReturn #True ; #True pour continuer l'opération
     EndIf
     
     ; on charge la ressource en mémoire, l'opération a réussie ?
     LoadResource = LoadResource_(hModule, Find_Resource)
     If LoadResource = #Null
          ProcedureReturn #True ; #True pour continuer l'opération
     EndIf
     
     
     ; *lpIconesource est un pointeur sur le premier octet de la ressource
     ; si *lpIconesource vaut 0, l'opération a échouée
     *lpIconesource = LockResource_(LoadResource)
     If *lpIconesource = #Null
          ProcedureReturn #True  ; #True pour continuer l'opération
     EndIf
     
     ; retrouve la taille de l'icône
     If (*lpIconesource\biWidth = *Icon\size) And (*lpIconesource\biheight/2) = *Icon\size
          ; icone trouvé, on extrait
          ; ; Let the OS make us an icon
          *Icon\hIcon = CreateIconFromResourceEx_(*lpIconesource, SizeofResource_(hModule, Find_Resource), #True, $00030000, *Icon\size, *Icon\size, 0)
          If AddElement(Icon_Liste()) = #Null
              *Icon\hIcon
              DestroyIcon_(*Icon\hIcon)
          EndIf
          Icon_Liste() = *Icon\hIcon
          
    
          If compteur = 0
              X_Position = 5
              Y_Position = -5 - 48
          ElseIf (48*compteur) > WindowHeight(0)
              compteur = 0
              X_Position + 48 + 5
              Y_Position = -5 - 48
          EndIf               
               
          Y_Position + 48 + 5
               
          ImageGadget(#PB_Any, X_Position, Y_Position, 48, 48, *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_ICON, @Enumerate_Icon(), @IconData)
     
     ; libère les ressources
     FreeLibrary_(hLibrary)
     
     ProcedureReturn IconData\hIcon
EndProcedure


If OpenWindow(0, 0, 0, 1000, 800, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

Create_Icon_From_EXEFile("Shell32.dll", 48)


Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow


;// destruction des icônes
ForEach  Icon_Liste()
     DestroyIcon_(Icon_Liste())
Next
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

sauf que mon but est de récupérer l'icône de n'importe quel fichier tel que le fait l'explorateur windows
Mais ton bout de code est tout de même intéressant :) merci Denis
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je n'avais pas tout compris ...

:D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Bon, Srod du forum anglais a trouvé la solution du problème :)

Je vais fignoler une fonction pour l'ensemble. Avec icône 16, 32, et 48

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Récupérer une icône de la taille 16*16, 32*32, 48*48


#SHIL_EXTRALARGE = $2

DataSection
IID_IImageList:
Data.l $46EB5926
Data.w $582E,$4017
Data.b $9F,$DF,$E8,$99,$8D,$AA,$09,$50
EndDataSection 
Structure IMAGELISTDRAWPARAMS
  cbSize.l
  himl.l
  i.l
  hdcDst.l
  x.l
  y.l
  cx.l
  cy.l
  xBitmap.l
  yBitmap.l
  rgbBk.l
  rgbFg.l
  fStyle.l
  dwRop.l
  fState.l
  frame.l
  crEffect.l
EndStructure
Interface IImageList2 Extends iUnknown
  Add(hbmImage, hbmMask, pi)
  ReplaceIcon(i, hIcon, pi)
  SetOverlayImage(iImage, iOverlay)
  Replace(i, hbmImage, hbmMask)
  AddMasked(hbmImage, crMask, pi)
  Draw(pimldp.IMAGELISTDRAWPARAMS)
  Remove(i)
  GetIcon(i, flags, picon)
  GetImageInfo(i, pImageInfo.IMAGEINFO)
  Copy(iDst, punkSrc.IImageList, iSrc, uFlags)
  Merge(i1, punk2.IImageList, i2, dx, dy, riid, ppv)
  Clone(riid, ppv)
  GetImageRect(i, prc.RECT)
  GetIconSize(cx, cy)
  SetIconSize(cx, cy)
  GetImageCount(pi)
  SetImageCount(uNewCount)
  SetBkColor(clrBk, pclr)
  GetBkColor(pclr)
  BeginDrag(iTrack, dxHotspot, dyHotspot)
  EndDrag()
  DragEnter(hwndLock, x, y)
  DragLeave(hwndLock)
  DragMove(x, y)
  SetDragCursorImage(punk.IImageList, iDrag, dxHotspot, dyHotspot)
  DragShowNolock(fShow)
  GetDragImage(ppt.POINT, pptHotspot.POINT, riid, ppv)
  GetItemFlags(i, dwFlags)
  GetOverlayImage(iOverlay, piIndex)
EndInterface

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

IconPath.s = "c:\"
SHGetFileInfo_(IconPath, 0, @FileInfo.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX)
Debug FileInfo\iIcon
dll_Shell32 = OpenLibrary(#PB_Any, "Shell32.dll")
If dll_Shell32
  *Guid = ?IID_IImageList
  hResult = CallFunction(dll_Shell32, "SHGetImageList", #SHIL_EXTRALARGE, *Guid, @ImageList.IImageList2)
  If hResult = 0
    Debug "ok SHGetImageList"
    hResult = ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon)
    If hResult = 0
      Debug "ok GetIcon"
    EndIf
  EndIf
  CloseLibrary(dll_Shell32)
EndIf

Debug hIcon
ImageGadget(0, 0, 0, 48, 48, hIcon)

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

If Icone
  DestroyIcon_(hIcon)
EndIf
Dernière modification par Le Soldat Inconnu le jeu. 14/mai/2009 10:45, modifié 1 fois.
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)]
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Cool. L'idéal serait de récupérer tous les formats du fichier existant. En 64;80;128 ou même 256.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Sous Win2000 professionnel, erreur ligne 81

Code : Tout sélectionner

    hResult = ImageList\GetIcon(FileInfo\iIcon, #ILD_TRANSPARENT, @hIcon) 
invalid memory acces (read error at adress 0)


je vais chercher pourquoi
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je pense que le problème vient de Win2000:

To use IImageList::GetIcon, specify Comctl32.dll version 6 in the manifest. For more information on manifests, see Enabling Visual Styles.


Il faut donc XP ou supérieur (ou Serveur 2003 ou >) pour utiliser cette interface et spécifier l'utilisation des thèmes en sélectionnant la case dans les options du compilateur (activer les thèmes XP) .
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oui, il faut XP ou plus.
Essai quand même en activant les thèmes XP dans le code sous 2000, par curiosité

pour 128 ou 256, il faut utiliser #SHIL_JUMBO (de tête) en paramètre de SHGetImageList
Mais cela ne fonctionne que sous Vista




Denis :
J'ai une question a propos de ton code à ce niveau

Code : Tout sélectionner

  If IS_INTRESOURCE(lpszName)
    ; c'est un pointeur sur une chaîne
    Find_Resource = FindResource_(hModule, PeekS(lpszName), #RT_ICON)
    Debug "1"
  Else
    ; c'est une valeur non un pointeur
    Find_Resource = FindResource_(hModule, MAKEINTRESOURCE(lpszName), #RT_ICON)
    Debug "2"
  EndIf
Je pense que c'est trop compliqué pour rien, je m'explique.
lpszName est une adresse mémoire, la fonction à besoin d'une adresse mémoire donc PeekS(lpszName) n'est pas utile, lpszName suffit
ce qui signifie au final que tu peux écrire

Code : Tout sélectionner

Find_Resource = FindResource_(hModule, lpszName, #RT_ICON)
De plus, en relisant la doc sur MSDN, il ne faut pas faire MAKEINTRESOURCE()
Il précise juste que si c'est un long, c'est un pointeur vers un string, et que sinon c'est un integer identifier
En tout cas, ça marche très bien sous XP avec ma simplification.
Tu en penses quoi ?
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

IS_INTRESOURCE Macro
This macro checks whether all bits except the least 16 bits are zero. When true, wInteger is an integer identifier for a resource. Otherwise it is typically a pointer to a string.
Il faut tester si la valeur, c'est pas moi qui le dit mais Microsoft.

Et j'ai vérifié sur des ressources qui ont des strings en identifiant d'ou le PeekS.

Effectivement, si la dll ou l'exe ou autres ne possèdent pas de strings comme identifiants, y a pas de problèmes, mais je te garantie qu'il y a des fichiers qui en ont et que ça plante.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

ok, merci

bon, juste comme ça, je part sur plus simple pour choper une icône d'une dll

Code : Tout sélectionner

#Return_Error = 0

; Utilisé pour charger une Dll, ICL, EXE en datafile (non executable)
#LOAD_LIBRARY_AS_DATAFILE = 2

Procedure.l Create_Icon_From_EXEFile(szFileName$, Size, Index)
  ; mémorise le handle de l'exe ou dll ouvert
  Protected hLibrary = 0
  
  
  ; 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
  
  hIcon = LoadImage_(hLibrary, Index, #IMAGE_ICON, Size, Size, 0)

  ; libère les ressources
  FreeLibrary_(hLibrary)
  
  ProcedureReturn hIcon
EndProcedure


If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

Index = 23
hIcon48 = Create_Icon_From_EXEFile("Shell32.dll", 48, Index)
hIcon32 = Create_Icon_From_EXEFile("Shell32.dll", 32, Index)
hIcon16 = Create_Icon_From_EXEFile("Shell32.dll", 16, Index)

ImageGadget(0, 2, 2, 0, 0, hIcon48)
ImageGadget(1, 2, 52, 0, 0, hIcon32)
ImageGadget(2, 2, 86, 0, 0, hIcon16)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow


DestroyIcon_(hIcon48)
DestroyIcon_(hIcon32)
DestroyIcon_(hIcon16)
J'ai trouvé ça par hasard et c'est exactement ce que je cherchais pour les DLL et Exe

Je vais finir mon bazar, ca donnera une petite lib pour choper l'icône d'un fichier, extraire l'icône d'une dll, exe
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

bon, en fait, mon hasard ne marche qu'avec shell32.dll
zut :lol:
Faut que je cherche plus pour lister les icônes par index (icône 1, 2, 3, etc... d'un fichier)
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