Dll de ressources et extraction

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Dll de ressources et extraction

Message 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
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: Dll de ressources et extraction

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

:wink:
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: Dll de ressources et extraction

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Dll de ressources et extraction

Message 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 ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
tatanas
Messages : 39
Inscription : mar. 05/nov./2019 18:40

Re: Dll de ressources et extraction

Message 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.
Répondre