Stricmp error
Résolu/Fermé
jboss38
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016
-
30 juin 2013 à 04:54
jboss38 Messages postés 829 Date d'inscription samedi 4 octobre 2008 Statut Membre Dernière intervention 14 décembre 2016 - 30 juin 2013 à 18:55
jboss38 Messages postés 829 Date d'inscription samedi 4 octobre 2008 Statut Membre Dernière intervention 14 décembre 2016 - 30 juin 2013 à 18:55
A voir également:
- Stricmp error
- Eespt technical error ✓ - Forum TNT / Satellite / Réception
- Error 0x80070643 - Accueil - Windows
- Cpu over temperature error - Forum Matériel & Système
- Fan error lenovo - Forum Refroidissement
- Error 10 pioneer ✓ - Forum Autoradio
2 réponses
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
Modifié par Hxyp le 30/06/2013 à 11:02
Modifié par Hxyp le 30/06/2013 à 11:02
Bonjour,
le problème est dû au fait que les types sont différents ( https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/ns-tlhelp32-processentry32?redirectedfrom=MSDN ) :
dans la struct PROCESSENTRY32, szExeFile est un WCHAR.
Et ça c'est le prototype de stricmp ( https://www.microsoft.com/en-us/download/details.aspx?id=55984 ):
int _stricmp(
const char *string1,
const char *string2
);
stricmp ne prend pas de WCHAR en paramètres mais des char la différence de taille entre les types les rend incompatible regardez ( http://msdn.microsoft.com/en-us/library/windows/desktop/gg269344%28v=exchg.10%29.aspx ) :
typedef unsigned short WCHAR;
"Data Types WCHAR A 16-bit Unicode character."
Du coup on ne peut pas comparer un tableau de WCHAR est un de char c'est comme comparer un tableau de short et de char.
Si le char fait 8bits et que le WCHAR fait 16bits vous pouvez comprendre que ça pose un problème lorsque stricmp qui utilise des pointeurs type char* pour faire la comparaison il va se balader dans les tableau avec un décalage utilisant la taille d'un char du coup s'il tombe sur un wchar qui fait 2char il va comparer deux char contre un seul wchar.
Vous pouvez tenter le cast comme indiqué avec de la chance ça peut marcher seulement faire un cast dans ces conditions revient à utiliser la chance pour que ça marche et ça peut bugger du jour au lendemain car windows autorise des noms de fichiers etc utilisant l'ucs2 (avec des WCHAR) donc si vôtre programme venait à être exécuté sur un système windows russe, jap,etc.. bah ça peut planter car la moitié d'un wchar d'un symbol jap ou russe peut être l'équivalent d'un char etc dans tout les cas on ne peut pas cast dans cette situation. Il faut remplacer la fonction stricmp et ne pas utiliser de char* pour les chaînes de comparaisons avec prEntry.szExeFile, bref avec tout ce qui utilise des WCHAR utilisez des WCHAR et des fonctions faites pour les gérer.
Remplacez char* name par un WCHAR *name, et remplacez stricmp par un fonction faite pour les wchar, par exemple wcscmp ( https://www.microsoft.com/en-us/download/details.aspx?id=55979 ) : "wcscmp and _mbscmp are wide-character and multibyte-character versions of strcmp. "
le problème est dû au fait que les types sont différents ( https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/ns-tlhelp32-processentry32?redirectedfrom=MSDN ) :
dans la struct PROCESSENTRY32, szExeFile est un WCHAR.
Et ça c'est le prototype de stricmp ( https://www.microsoft.com/en-us/download/details.aspx?id=55984 ):
int _stricmp(
const char *string1,
const char *string2
);
stricmp ne prend pas de WCHAR en paramètres mais des char la différence de taille entre les types les rend incompatible regardez ( http://msdn.microsoft.com/en-us/library/windows/desktop/gg269344%28v=exchg.10%29.aspx ) :
typedef unsigned short WCHAR;
"Data Types WCHAR A 16-bit Unicode character."
Du coup on ne peut pas comparer un tableau de WCHAR est un de char c'est comme comparer un tableau de short et de char.
Si le char fait 8bits et que le WCHAR fait 16bits vous pouvez comprendre que ça pose un problème lorsque stricmp qui utilise des pointeurs type char* pour faire la comparaison il va se balader dans les tableau avec un décalage utilisant la taille d'un char du coup s'il tombe sur un wchar qui fait 2char il va comparer deux char contre un seul wchar.
Vous pouvez tenter le cast comme indiqué avec de la chance ça peut marcher seulement faire un cast dans ces conditions revient à utiliser la chance pour que ça marche et ça peut bugger du jour au lendemain car windows autorise des noms de fichiers etc utilisant l'ucs2 (avec des WCHAR) donc si vôtre programme venait à être exécuté sur un système windows russe, jap,etc.. bah ça peut planter car la moitié d'un wchar d'un symbol jap ou russe peut être l'équivalent d'un char etc dans tout les cas on ne peut pas cast dans cette situation. Il faut remplacer la fonction stricmp et ne pas utiliser de char* pour les chaînes de comparaisons avec prEntry.szExeFile, bref avec tout ce qui utilise des WCHAR utilisez des WCHAR et des fonctions faites pour les gérer.
Remplacez char* name par un WCHAR *name, et remplacez stricmp par un fonction faite pour les wchar, par exemple wcscmp ( https://www.microsoft.com/en-us/download/details.aspx?id=55979 ) : "wcscmp and _mbscmp are wide-character and multibyte-character versions of strcmp. "
jboss38
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016
33
30 juin 2013 à 18:03
30 juin 2013 à 18:03
Aaaaaaaaaaaaahhhhhh
J'ai réfléchis et maintenant je me rappel que j'avais eu un problème de caractère en Unicode, je suis donc passez en multioctet pour résoudre le problème:
Il faut allez dans "Projet", puis allez dans Propriétés -> Propriétés de configuration -> Général -> Jeu de caractères, sélectionner le second choix à savoir, Utiliser le jeu de caractères multioctet.
J'ai réfléchis et maintenant je me rappel que j'avais eu un problème de caractère en Unicode, je suis donc passez en multioctet pour résoudre le problème:
Il faut allez dans "Projet", puis allez dans Propriétés -> Propriétés de configuration -> Général -> Jeu de caractères, sélectionner le second choix à savoir, Utiliser le jeu de caractères multioctet.
30 juin 2013 à 15:14
mais j'ai utiliser le même code dans une autre application "Console application" et sa marche parfaitement, c'est pour sa que je suis un peut déboussolé, la j'utilise une application Windows Form c'est la seul différence...
30 juin 2013 à 17:11
Modifié par jboss38 le 30/06/2013 à 17:56
error C2664: 'GetProcessID' : impossible de convertir le paramètre 1 de 'const char [8]' en 'wchar_t *'
1> Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
Modifié par Hxyp le 30/06/2013 à 18:05
char test[8]="hello";
GetProcessID(test);
après avoir remplacer les types char de la fonction ?
30 juin 2013 à 18:55