Undefined value

cs_elpens Messages postés 260 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 3 novembre 2007 - 27 oct. 2007 à 16:25
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009 - 28 oct. 2007 à 10:06
Bonjour,

j'ai un petit soucis avec un test qui ne passe pas...

J'ai un Char *strName qui a comme valeur

Je voudrais l'empêcher de passer dans ma boucle. Pour ce faire, j'ai testé:

- if(strName != NULL)
- if(strName != "")
- if(strName != " ")
- if(sizeof(strName) > 0)      //étonnament, sizeof = 4...

Mais aucun de ces tests ne fonctionne, elle passe toujours dans ma boucle

Merci pour votre aide

 ElpenS

7 réponses

cs_elpens Messages postés 260 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 3 novembre 2007
27 oct. 2007 à 16:50
Excusez-moi...

En fait, il suffit de faire
if(*fctStr != NULL)... bien-sûr

Mais en faisant cela, le probleme maintenant est que j'obtient l'erreur:

Attempted to read or write protected memory, This is often an indication that memory is corrupted...

Merci pour votre aide!

 ElpenS
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
27 oct. 2007 à 17:20
Il sort d'où ton pointeur? Parce que là apparemment tu essayes d'accéder à une zone interdite... Mets voir le code avant.
0
cs_elpens Messages postés 260 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 3 novembre 2007
27 oct. 2007 à 17:30
En fait, je vais chercher le nom des fonctions API présentent dans un exe.
Donc cette addresse est de l'ordre de 0x85000000, d'ou le problème mémoire...

 ElpenS
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
27 oct. 2007 à 18:05
Ouais d'accord mais du moment que tu utilises tout correctement...j'insiste pour voir le code

Au passage quelques remarques sur tes premiers posts :

strName != "" ou  strName != " "
Tu testes ici si ton pointeur pointe sur les chaînes de caractères "" et " " que le compilateur va donc créer quelque part sur la pile ou dans les données constantes...ca ne sert strictement à rien; si tu veux comparer des chaînes il faut faire par exemple if strName[0]!='\0' ou *strName!='\32' etc...

sizeof(strName)>0
Attention sizeof ne renvoie en aucun cas la taille de la chaîne mais la taille du pointeur qui sert à la référencer (ici 4, t'es en Win32).

*fctStr != NULL
Là ca ne teste pas si le pointeur est invalide mais seulement si le premier caractère est le caractère nul (équivalent à fctStr[0]!='\0').

En fait pour tester si le pointeur est valide ta toute première solution était la bonne if(strName != NULL); du moment que le pointeur pointe au bon endroit, ce qui n'a pas l'air d'être ton cas, donc le code serait utile.
0

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

Posez votre question
cs_elpens Messages postés 260 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 3 novembre 2007
27 oct. 2007 à 18:22
Yes, comme quoi on en apprend tout les jours!

Bon, le code maintenant:

//Je vais rechercher les fonctions de mon PE
while(pimage_thunk_data->u1.AddressOfData!=0)
{

   try
   {
      dwAPIaddress = pimage_thunk_data->u1.AddressOfData;
      pFctName = pImageBase + dwAPIaddress + pimage_section_header->PointerToRawData - pimage_section_header->VirtualAddress +2;

   //Insert value into struct
   fctData[tabCount].dllName = (pImageBase + pimage_import_descriptor->Name + pimage_section_header->PointerToRawData -pimage_section_header->VirtualAddress);
   fctData[tabCount].fctAddress = (dwThunk + pimage_nt_headers->OptionalHeader.ImageBase);
   fctData[tabCount].fctName = pFctName;

...

Ensuite, quand je parcours mon fctData[], je n'ai pas de problème, tant que la fonction a un nom. Mais par exemple, SHLWAPI.dll contient des fonctions qui sont appelé par #436, c-a-d que je ne peux pas récupérer le nom de la fonction.
Donc, quand je veux lire mon fctData[i].fctName et qu'il n'y a pas de nom, mon programme plante car l'address enregistree est protégé...

Est-ce clair?

Merci en tout cas, ce post n'aura pas été inutile

 ElpenS
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
27 oct. 2007 à 19:10
C'est plus clair comme ça...Effectivement le IMAGE_THUNK_DATA est une union qui représente soit un pointeur vers le nom, soit un ordinal, soit autre chose...En fait apparemment il suffit de tester le bit de poids fort; si c'est 1 c'est un ordinal en fin du moins faut prendre les 31 bits de poids faible...enfin un truc de ce genre; j'ai trouvé cette page qui pourrait t'aider, j'ai juste survolé mais ils parlent effectivement de ce problème.
http://msdn.microsoft.com/msdnmag/issues/02/03/PE2/

Bonne prog.
0
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
28 oct. 2007 à 10:06
- if(sizeof(strName) > 0)      //étonnament, sizeof = 4...

strlen serait plus approprié, pour info, les réponses aont déja été donnés par les autres

bon codage :p
0
Rejoignez-nous