Page 1 sur 1
Dll de ressources et extraction
Publié : jeu. 23/janv./2020 19:32
par tatanas
Bonsoir à tous,
Afin d'éviter de laisser traîner trop de fichiers dans le dossier de mon application, j'ai intégré tous mes icônes dans un fichier Dll grâce au logiciel Resource Hacker.
J'ai ensuite pu les extraire pour les utiliser dans mon application avec la fonction ExtractIcon_() (entre autres). Aucun problème jusque là.
J'ai aussi intégré à cette Dll quelques fichiers Gif. Apparaît alors un dossier RCData dans lequel se trouvent mes Gif (dossiers Icon et IconGroup pour les icônes).
Et là je n'arrive pas à charger ces Gif. J'ai tenté avec LoadImage_() mais j'ai aussitôt un problème avec GetModuleHandle_("chemin dll").
Est-ce possible de récupérer le handle de cette ressource comme je le fais avec les icônes ?
Code : Tout sélectionner
Macro LOWORD(Value)
Value & $FFFF
EndMacro
Macro MAKEINTRESOURCE(INT)
LOWORD(INT)
EndMacro
hlib = GetModuleHandle_("chemin dll")
If hlib
pimage = LoadImage_(hlib, "nomgif / index", #IMAGE_BITMAP, 0, 0, #LR_DEFAULTCOLOR)
If Not pimage
Debug GetLastError_()
End
EndIf
Else
Debug "hlib="
Debug GetLastError_()
End
EndIf
If OpenWindow(0, 0, 0, 245, 105, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(0, 10, 10, 64, 64, pimage)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Re: Dll de ressources et extraction
Publié : ven. 24/janv./2020 9:44
par Marc56
Dans le cas où les images ne sont ni des .ICO ni des .GIF animés, il est aussi possible (et simple) de faire une planche ou bande d'image et d'utiliser ensuite
GrabImage() pour les extraire.
C'est comme ça que je stocke et recharge les 300 icônes images de mon lanceur (acme desk) sauvegardées en PNG. J'ai nommé le fichier .DLL mais c'est juste une bande de 300 images côte à côte.

Re: Dll de ressources et extraction
Publié : sam. 25/janv./2020 12:09
par tatanas
Merci mais cela n'a strictement aucun rapport avec mon sujet...
J'ai fini par y arriver. Si vous souhaitez intégré vos gif ou png dans une dll avec Resource Hacker, vous pouvez utiliser ce code pour les extraire.
Soit en recréant le fichier image dont vous avez besoin de façon temporaire soit en utilisant CatchImage().
Code : Tout sélectionner
Macro MAKEINTRESOURCE(Value)
(Value & $FFFF)
EndMacro
Macro IS_INTRESOURCE(Val)
Bool(Val & ~$FFFF)
EndMacro
#LOAD_LIBRARY_AS_IMAGE_RESOURCE = $20
#LOAD_LIBRARY_AS_DATAFILE = $2
Dim a_ImgResource(1) ; this array will stock the result of GetImagePointerFromResource()
; a_ImgResource(0) = pointer to the image
; a_ImgResource(1) = size of the image
; Load an image (gif, png, ...) from Dll Resource file created with Resource Hacker
; Depending on the destination of the image inside the Dll, Choose a known ResourceType like #RT_RCDATA or a custom one like "PNG"
;
; -- Parameters --
; a_ImgResource(1) : Array containing pointer and size of the image in resource file
; DLL_Path : Path to the Dll Resource file
; Image_Name : Name of the image inside the Dll (defined when you import the file with Resource Hacker)
; ResourceType : Resource Type (https://docs.microsoft.com/en-us/windows/win32/menurc/resource-types)
; CustomResourceTypeName : Custom Name of the resource type (for example : if you import a png with Resource Hacker, it creates a "PNG" resource type)
;
; -- Return --
; 0 if error
; 1 if success and a_ImgResource() filled
Procedure.i GetImagePointerFromResource(Array a_ImgResource(1), DLL_Path.s, Image_Name.s, ResourceType = #RT_RCDATA, CustomResourceTypeName.s = "")
Protected hModule ; dll module handle
Protected hResource ; handle to the specified resource's information block
Protected hData ; handle to the data associated with the resource
Protected *pResource ; pointer to the first byte of the resource
Protected SizeofResource ; number of bytes in the resource
hModule = LoadLibraryEx_(DLL_Path, #Null, #LOAD_LIBRARY_AS_IMAGE_RESOURCE|#LOAD_LIBRARY_AS_DATAFILE)
If hModule = #Null
MessageRequester("Information", "LoadLibraryEx Error")
ProcedureReturn 0
EndIf
If CustomResourceTypeName = ""
hResource = FindResource_(hModule, Image_Name, MAKEINTRESOURCE(ResourceType))
Else
hResource = FindResource_(hModule, Image_Name, CustomResourceTypeName)
EndIf
If hResource = #Null
MessageRequester("Information", "FindResource Error")
ProcedureReturn 0
EndIf
hData = LoadResource_(hModule, hResource)
If hData = #Null
MessageRequester("Information", "LoadResource Error")
ProcedureReturn 0
EndIf
*pResource = LockResource_(hData)
If *pResource = #Null
MessageRequester("Information", "LockResource Error")
ProcedureReturn 0
EndIf
SizeofResource = SizeofResource_(hModule, hResource)
a_ImgResource(0) = *pResource
a_ImgResource(1) = SizeofResource
ProcedureReturn 1
EndProcedure
; Example :
; If GetImagePointerFromResource(a_ImgResource(), "resources.dll", "myGifName")
If GetImagePointerFromResource(a_ImgResource(), "resources.dll", "myPNGName", #RT_RCDATA, "PNG")
; If CreateFile(0,"test.gif")
If CreateFile(0,"test.png")
WriteData(0, a_ImgResource(0), a_ImgResource(1))
CloseFile(0)
Else
MessageRequester("Error", "Could not create file")
EndIf
EndIf
Re: Dll de ressources et extraction
Publié : sam. 25/janv./2020 19:43
par Ar-S
Vrai question même si tu as réussi ce que tu voulais faire. Pourquoi n'utilises tu pas les inclusions en datasection ?
Re: Dll de ressources et extraction
Publié : sam. 25/janv./2020 21:42
par tatanas
En fait je débute en PB et je ne connaissais pas le fonctionnement en data section. Je savais que c'était possible avec une dll de ressources, j'ai donc creusé dans cette direction.