Bonjour tout le monde,

Je me retourne vers vous, car j'hésite et je cale sur un point

Je suis en train de créé un programme qui permet de rentrer dans une dll spéciale et de modifier les photos dedans, type bmp, jpg, png, ico et ect

Pour les bitmap et les icônes je n'ai aucun problèmes, car dans les dll et les exe ils sont de format natif, donc cela se remplace sans problèmes.

J'utilise ceci dans mon module

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Option Explicit
 
'entête d'un fichier BITMAP
Private Type BITMAPFILEHEADER   ' 14 Bytes
     bfType As Integer
     bfSize As Long
     bfReserved1 As Integer
     bfReserved2 As Integer
     bfOffBits As Long
End Type
 
'un fichier BITMAP
Private Type Bitmap
    Header As BITMAPFILEHEADER
    Data() As Byte
End Type
 
'obtient un  handle de modification de ressource
Private Declare Function BeginUpdateResource Lib "kernel32.dll" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
'met à jour des infos de ressource
Private Declare Function UpdateResource Lib "kernel32.dll" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
'enregistre des infos de ressource dans le fichier
Private Declare Function EndUpdateResource Lib "kernel32.dll" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
'copie une zone mémoire dans une autre
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long)
 
'ressource bitmap
'type Resource Bitmap
Private Const RT_BITMAP As Long = 2&
 
'extrait les données d'un fichier Bitmap pour le transformer en ressource
'========================================================================
'FileName : nom du fichier Bitmap
'renvoie une structure bitmap (entête + données)
Private Function MakeBitmapExe(FileName As String) As Bitmap
Dim FileNum As Integer
 
FileNum = FreeFile
Open FileName For Binary As #FileNum
    Get #FileNum, , MakeBitmapExe.Header
    ReDim MakeBitmapExe.Data(MakeBitmapExe.Header.bfSize - 14)
    Get #FileNum, , MakeBitmapExe.Data
Close #FileNum
End Function
 
'remplace une bitmap du fichier
'===============================
'FileName : nom du fichier executable
'BitmapFile : nom du fichier icone
'BaseID : ID de la bitmap
'LangID : ID de la langue de la bitmap
Public Function ReplaceBitmapInExe(FileName As String, BitmapFile As String, BaseID As Long, LangID As Long) As Boolean
Dim hWrite As Long 'handle de modification
Dim ret As Long 'valeur de retour
Dim Exe As Bitmap 'contenu du fichier bitmap
Dim X As Long 'compteur
 
'obtient un handle de modification
hWrite = BeginUpdateResource(FileName, 0)
 
'si échec, on quitte
If hWrite = 0 Then ReplaceBitmapInExe = False: Exit Function
 
'sinon, on lit l'icone
Exe = MakeBitmapExe(BitmapFile)
 
'on met à jour la ressource bitmap
ret = UpdateResource(hWrite, RT_BITMAP, BaseID, LangID, ByVal VarPtr(Exe.Data(0)), UBound(Exe.Data))
 
'si échec, on quitte
If ret = 0 Then ReplaceBitmapInExe = False: EndUpdateResource hWrite, 1: Exit Function
 
'on enregsitre dans le fichier executable
ret = EndUpdateResource(hWrite, 0)
'si échec, on quitte
If ret = 0 Then ReplaceBitmapInExe = False: Exit Function
 
'sinon succès
ReplaceBitmapInExe = True
End Function
Et ma form

Pour choisir la dll, choisir son image ou icônes, ainsi que son numero et son ID, ainsi que le bouton appliquer :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub cmdAddModify_Click()
On Error Resume Next
If ReplaceBitmapInExe(txtExe.Text, txtBMP.Text, txtIcoID.Text, txtLangID.Text) = True Then
    MsgBox "Changement d'icone effectué avec succès", vbInformation
Else
    MsgBox "Echec de changement d'icone"
End If
End Sub
 
Private Sub cmdEXE_Click()
CD.Filter = "*.exe;*.dll|*.exe;*.dll|Tous|*.*"
CD.FilterIndex = 0
CD.ShowOpen
txtExe.Text = CD.FileName
End Sub
 
Private Sub cmdICO_Click()
CD.Filter = "Bitmap|*.bmp|Tous|*.*"
CD.FilterIndex = 0
CD.ShowOpen
txtBMP.Text = CD.FileName
End Sub
 
Private Sub Form_Load()
 
End Sub
Pour passer les jpg et png pour ne pas avoir de problèmes, je les met en format res.

Cela rentre dans la dll sans aucun problèmes, mais le hic qui se pose dans la dll

Est que j'ai un dossier bitmap, un dossier icones et un dossier jpg

Les bitmap vont dans le dossier bitmap, les icônes dans le dossier icônes, mais les jpg au format res vont dans le dossier bitmap, y a t-il moyen de faire en sorte de leur faire comprendre quelles doivent pas aller dans ce dossier mais aller dans le dossier Jpg