Bonjuour à tous !

Je travaille en C, Borland 5.5, et j'essaie de m'accoutumer avec la programmation de l'API.
Je voudrais un éclaircissement sur la fonction UpdateResource avec laquelle je suis un peu familiarisé maintenant :

En fait, j'avais encodé l'exemple de l'API (Using Resources - Updating resources), dans le but de remplacer l'icône de winmine.exe par celui de calc.exe :

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
#include <stdio.h>
#include <windows.h>

void main	&#40;&#41;

&#123;
HANDLE hExe;		// handle to existing .EXE file 
HRSRC hRes;		// handle/ptr to res. info.
HRSRC hResLoad;		// handle to loaded resource
HANDLE hUpdateRes;	// handle to update resource
char * lpResLock;		// pointer to resource data
BOOL result1,result2;

// charger calc.exe dont je veux copier l'icône
hExe = LoadLibrary&#40;"C&#58;\\Borland\\BCC55\\essais\\ess_win\\calc.exe"&#41;;
printf&#40;"\nLoadLibrary - hExe = %i ", hExe&#41;;

// localiser l'icône n°1 dans calc.exe
hRes = FindResource&#40;hExe, "#1", RT_ICON&#41;;
printf&#40;"\nFindResource - hRes = %i ", hRes&#41;;

// charger l'icône en mémoire
hResLoad = LoadResource&#40;hExe,hRes&#41;;
printf&#40;"\nLoadResource - hResLoad = %i ", hResLoad&#41;;
 
// la verrouiller en mémoire
lpResLock = LockResource&#40;hResLoad&#41;;
printf&#40;"\nLockResource - lpResLock = %i ", lpResLock&#41;;


// ouvrir winmine dont je veux substituer &#40;!&#41; l'icône par celle de calc
hUpdateRes = BeginUpdateResource&#40;"C&#58;\\Borland\\BCC55\\essais\\ess_win\\winmine.exe", FALSE&#41;;
printf&#40;"\nBeginUpdateResource - hUpdateRes = %i ", hUpdateRes&#41;;

// modifier l'icône n°1 de winmine
result1 = UpdateResource
	&#40;
	hUpdateRes,
	RT_ICON,
	"1",
	1036,
	lpResLock,
	SizeofResource&#40;hExe,hRes&#41;
	&#41;;
printf&#40;"\nUpdateResource - result1 = %i ", result1&#41;;

// écrire les changements dans winmine et fermer
result2 = EndUpdateResource&#40;hUpdateRes, FALSE&#41;;
printf&#40;"\nEndUpdateResource - result2 = %i ", result2&#41;;

// nettoyage
FreeLibrary&#40;hExe&#41;;

&#125;
Ces deux petits programmes ont la même structure d'icônes (une seule ressource RT_GROUP_ICON et deux ressources RT_ICON #1 et #2). L'icône n°1 est de même taille et fait 744 octets pour chacun.

Seulement ,
avec ce code, l'icône de calc ne se substitue pas à celle de winmine, mais s'y ajoute avec le même nom, ce qui n'est pas le résultat souhaité. (la taille de winmine augmente)

D'autre part, si je donne la valeur NULL au paramètre lpData (au lieu de lpResLock) de la fonction UpdateResource, cela devrait simplement détruire l'icône n°1 de winmine...
et bien non, cela génère une erreur système...

J'ai également essayé de substituer le RT_GROUP_ICON et les deux RT_ICON...
rien à faire...

Tout cela me fait penser que l'icône que j'essaie de modifier est "verrouillée" en quelque sorte par un autre processus.

qui peut me dire ce qu'il en est ? et comment faire ?

Merci,


Juan.