FindResource

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 19 juin 2009 à 14:15
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 19 juin 2009 à 22:58
Yop à tous,

Voila j'ai un big problème. En fait je crée une liste des resource d'un exe dans mon application. Et lorsque je clique sur une d'entre elle , je voudrai afficher la taille.

Mais voila le problème c'est que FindResource me renvoie une erreur. Le pire c'est que je sais pourquoi mais je voi pas comment y remédier.

En fait le type et le nom de la resource je l'es récupère dans ma liste, mais ce sont des char* et donc si je passe cela comme paramètre a FindResource il me dirat erreur pour les types ou noms quine sont pas des chaîne de char mais des int. Mais voila j'ai esseye de faire les différence avec IS_INTRESOURCE

Seulement aparement lorsque je passe un char* cette macro ne fonctionne pas car mm quand c'est mettons un type int il me renvoie que non. Donc je me suis dit je vais faire la fonction moi même :

BOOL

__stdcall isInt(
char *szString){

char * p;p = szString;

while(*p){

   if(*p < 48 || *p > 57){
return FALSE;}   p++;

}

return TRUE;}

Il y a déjà quelques amélioration mais c'est pas encore ça :s . Donc voila , je suis en grand manque d'idées. Si quelqu'un en a une je suis preneur.

Merci d'avance.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]

21 réponses

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 15:08
Non cela fonctionne très bien , j'avais fait une faute autre part. Mais juste pour être sur il ne risque pas d'y avoir une resource mettons avec un nom 128 qui en fait ne serai pas un nombre, mais bien une chaine de caractère. Pour moi non mais on ne sais jamais.

Si quelqu'un est sur :)

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 19:03
Pour ma part je fais comme ca :

BOOL __stdcall isInt(char *szString)

{

  return (DWORD)szString <= 0xFFFF;

}
_____________________________________
Un éditeur de ressources gratuit pour Windows
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 19:06
En fait je pense pas que ton code marche car si szString vaut 3 par exemple, tu ne peux pas accéder à *szString

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 20:29
Oula ata si szString vaut 3 tu veux dire si szString = "3" ? car cela fonctionne très bien :s dans ma liste j'ai des numéro qui valent 1 2 3 4 ... et ça va très bien, je comprend pas trop ce que tu veux dire.


et heu return (DWORD)szString <= 0xFFFF; j'ai un peu du mal a saisir avec (DOWRD) tu pointes sur la 4 premier bystes ok mais 0xFFFF ? quel est sont rôle ?






++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 20:31
Ha pour le 3 tu veut parler non pas d'un caractère mais d'une valeur entière ? ben cela n'arrivera jamais dans mon programme car tous les types et noms de resource sont en char* donc les nombres sont de toute façons une chaîne de caractère.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 21:09
Si tu es sur que ce sont des chaines, ya pas de problème alors t'a juste a vérifier que la chaine ne contient que des chiffres, je ne vois pas ou est le problème.
Mais cette chaine szString, tu la récupère comment? Si tu utilises EnumResNameProc, et si le type de ressource est 3, tu aura bien lpszName=3 et non *lpszName='3'
Si le type de ressource est "3" tu auras effectivement *lpszName = 3.

Pour mon 0xFFFF, c'est que les types de ressources entiers sont inférieurs ou égaux à 0xFFFF, du coup si lpszName est supérieur à 0xFFFF c'est un type chaine, sinon c'est un type entier (c'est pas joli comme méthode mais j'ai pas trouvé mieux, les méthodes d'énumération des ressources sont mal foutues à ce niveau).

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 21:30
Oui oui je suis sur que ce ne sera que des chaînes ces pour ça que je voyai pas trop ce qui n'allait pas dans ma méthode d'après ce que tu me disait. Oui non aucun problème je sais que ça fonctionne très bien comme ça, mais je me demandai si tu vois il se pourrait que lorsqu'un utilisateur crée une resource il donne un nom qui en fait est un numéro en chaîne de caractère et non un nombre , je sais pas si tu me suis, d'après les manières de déclaration de resource ect, je dit que c'est pas possible, mais sait-on jamais , donc c'était pour être sur ^^ je sais pas si tu m'as compris :)

Oui je trouve aussi que c'est mal fichu de devoir savoir si c'est un intier ou une chaîne microsoft devrait instaurer une sorte de standard pour cela :)

Haaa daccord c'est plus claire pour le 0xFFFF, note je sais pas ou tu vas tjrs chercher ces infos ^^ car j'ai lu pas mal de page sur les resources dans la MSDN et je suis jamais tombé sur cette info ^^

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 21:40
Oh ben en fait j'ai eu l'occasion d'étudier la structure de la section .rsrc des fichiers PE donc je vois un peu comment c'est fait. D'ailleurs je pense écrire mon propre browser de ressource pour m'éviter d'utiliser les méthodes d'enum fournies.
Cela dit, je ne comprends toujours pas ton problème.
Voici les différents cas qu'on peut avoir :

Type de ressource sous forme d'entier : 3
Type de ressource sous forme de chaine : dans ce cas ca peut-être une chaine "TOTO" ou bien "123" (bien que le format .rc ne te permette pas de définir une ressource avec un type chaine qui contient un entier, ou alors il faut que tu me montres comment tu fais...).
Dans tous les cas, quel est l'intéret de savoir si la chaine contient un entier ou non? Je ne vois pas pourquoi tu cherches à savoir ca. Car même si la chaine est "123", ca n'a rien a voir avec un entier.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 21:45
bien que le format .rc ne te permette pas de définir une ressource avec un type chaine qui contient un entier, ou alors il faut que tu me montres comment tu fais...) Voila tu as mis le doigt sur ma question et tu y a répondu. Donc voila pourquoi je me posait cette question car en ce cas, ma méthode isInt serait éronée si c'était une chaine "123" , ma méthode la prendrai pour un nombre et passerai un entier a ma fonction FindResource hors je devrait lui passer une chaîne de caractère dans ce cas précis. Mais comme tu me confirme que le format .rc interdit ce genre de chose , ma fonction fonctionnera dans tous les cas, c'est ce que je voulait savoir :)

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 21:49
Tu ne peux pas le faire dans avec le fichier .rc, mais ca ne veut pas dire que c'est impossible (certains outils permettent de le faire, et ne serait-ce que avec BeginUpdateResource tu peux le faire par programmation).
Par contre, je reviens à ma question de départ : à quoi peut bien te servir ta fonction isInt???
J'insiste sur ce point car je pense que tu fais fausse route.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 21:55
mmm ok , c'est embetant ça :s.

FindResource prend notament en paramètre le nom et le type , hors c'est paramètre on chacun la possibilité d'être soit des entier ou soit des chaine de caractère , voila a quoi sert ma fonction isInt , a savoir si je doit convertir mon char* en int ou pas pour la passer en paramètre a FindResource.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 22:01
En gros tu as en entrée une chaine de caractères pour le nom et le type et tu veux trouver la ressource correspondante?
Alors effectivement tu as un problème par "123" peut désigner un type chaine et un type entier (et tu peux très bien avoir les deux dans le même exécutable). Je pense que le cas ou tu as une chaine qui contient représente un entier est quand même peu probable car la majorité des gens utilisent des fichiers .rc pour créer des ressource.
Donc à ta place je ferais comme ca :
Si la chaine représente un entier :
Tu essaies FindResource avec la chaine
Tu essaies FindResource avec l'entier obtenu par conversion
Et selon le résultat tu fais ce qui tu as à faire (mais tu dois savoir qu'il est possible que les deux FindResource te retournent un résultat valide).

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 22:08
Oui si ce problème qui aparement est le cas serai un problème possible c'est ce que j'ai pensé. Oui cela peut renvoyer deux réponse correcte , mais chacune désignant une resource différente :) . ben en fait si tu as un autre moeyn je t'écoute. Car mon programme en fait lorsque on lui donne un exe fait une liste des resources avec les fonction Enum et les place dans un treeview et a partir de la je travail plus que avec des char* . J'avai penser aussi , que avec mon char* je refasse une recherche avec les enum et vu que avec ces fonction le IS_INTRESOURCE fonctionne je pourrai comparer de manière sur, mais bon vraiment pas optimisée comme solutions :s

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 22:11
Ben si tu stockes tout sous forme de char* c'est sûr que tu perds l'information, donc même pas la peine de chercher. Il te faut une autre variable qui indique si c'est du type entier ou chaine (au moment de l'enum tu connais cette information).

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 22:16
héhé j'y ai penser aussi à ça :p (comme quoi lol ) mais dans ce cas il faudrait que je fasse une liste en parallèle a mon treeview :s car j'ai pas envie de stocker cette information dans le treeview. A mon que je le place a titre d'information, c'est vrai que cela peut être utile a savoir aussi pour un utilisateur du programme , mmm c'est a méditer ça :)

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 22:21
Le méthode générale : tu définis une structure ou tu as toutes les infos utiles sur un élément du TreeView, et tu le mets dans TVITEM.lParam
Par curiosité il fait quoi ton programme?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 22:25
ha ça par contre je n'y avait pas pensé au param ^^ . Ben en gros tu lui donne un exe ou une dll a manger, il te ressort toutes les resources présente et tu peux supprimer, ajouter, modifier et extraire.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 22:33
Exactement ce que je suis en train de faire :)
Par contre je sais pas si tu compte utiliser BeginUpdateResource/EndUpdateResource mais si c'est le cas tu va vite te rendre compte que ces fonctions ne marchent pas très bien...

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 juin 2009 à 22:39
ha bon :) ben je voulait pas te copier lol je savai pas :)
Oui de fait je comtai les utiliser :) ha bon , décidément on ai pas gâté niveau API pour les resources lol.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
19 juin 2009 à 22:43
Ouais j'ai carrément du réécrire toutes les fonctions!
Si ca t'intéresse, un article qui parle de ce problème : http://blogs.msdn.com/michkap/archive/2008/08/21/8883552.aspx
Exemple typique ou UpdateResource ne marche pas : un exe qui ne contient pas de section .rsrc : si tu veux lui ajouter une ressource ca ne marche pas (il ne crée par la section).

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
Rejoignez-nous