IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

utilisation de UpdateResource pour les icônes ?


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 15
    Points
    15
    Par défaut utilisation de UpdateResource pour les icônes ?
    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.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    As tu ouvert ton exe modifié avec un éditeur de resources (res hacker) pour voir ce qui s'était passé ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Bonjour Aurélien et bonjour à tous !

    Oui, bien sûr, avec 'Resource Tuner' ; c'est comme ça que j'ai pu voir ce qui s'était passé.

    Le 'Resource Tuner' montre clairement que l'icône #1 de calc s'est ajoutée à celles existantes dans winmine, en conservant son #1.

    Je me retrouve donc avec deux icônes #1 (et une #2) dans winmine dont la taille a augmenté.


    qu'en penses-tu ?

    PS : je ne connais pas 'res hacker' ; où peut-on le trouver ?


    à bientôt et merci,

    Juan.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    OK pour 'res hacker', je l'ai trouvé...

  5. #5
    Membre habitué Avatar de ken_le_videur
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 129
    Points : 145
    Points
    145
    Par défaut
    Tu as essayé en utilisant la macro MAKEINTRESSOURCE ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    result1 = UpdateResource
       &#40;
       hUpdateRes,
       RT_ICON,
       MAKEINTRESOURCE&#40;1&#41;,
       1036,
       lpResLock,
       SizeofResource&#40;hExe,hRes&#41;
       &#41;;

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    non, je ne l'avais pas utilisée, et je vois avec plaisir que c'était là mon oubli.

    Je suppose que sans cette MACRO, j'obtenais deux icônes n°1, mais que pour l'une (l'original de winmine) le '1' était un ordinal, alors que pour l'autre (celle de substitution) le '1' était un 'string', donc forcément il n'y ne pouvait y avoir substitution mais addition.

    En tout cas ça marche maintenant.


    Je te remercie,


    à bientôt,


    Juan.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utiliser le calendrier pour les champs date
    Par montassar.nizar dans le forum JDeveloper
    Réponses: 3
    Dernier message: 17/08/2008, 14h31
  2. Utiliser Java EE pour les batchs, est-ce pertinent ?
    Par glumak dans le forum Général Java
    Réponses: 9
    Dernier message: 29/06/2007, 00h26
  3. Utilisation des références pour les tableaux
    Par Bouboubou dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 4
    Dernier message: 14/12/2005, 13h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo