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

Visual C++ Discussion :

Convertir un tableau WCHAR en const char*


Sujet :

Visual C++

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut Convertir un tableau WCHAR en const char*
    Bonjour,

    J'ai ce bout de code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    PROCESSENTRY32 pe = { 0 };
     
    		pe.dwSize = sizeof(PROCESSENTRY32);
     
    		BOOL bRet = Process32First(hSnapshot, &pe);
     
    		while (bRet)
    		{
     
    			if (!_stricmp(pe.szExeFile, szExeName))
    A la compilation j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Erreur	1	error C2664: 'int _stricmp(const char *,const char *)'*: impossible de convertir l'argument 1 de 'WCHAR [260]' en 'const char *'
    Mon soucis c'est comment convertir un wchar [] en const char* , Je suis sous visual studio express et le projet est configuré pour utiliser unicode, j'ai pas trouvé d'infos précise pour corriger ce bug.

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Blo0d4x3 Voir le message
    j'ai pas trouvé d'infos précise pour corriger ce bug.
    Et pourtant:

  3. #3
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    ok.

    Ce que j'aimerai comprendre aussi, c'est que ce bout de code:

    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
    DWORD dwRet = 0;
        DWORD dwCount = 0;
     
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     
        if (hSnapshot != INVALID_HANDLE_VALUE)
        {
            PROCESSENTRY32 pe = {0};
            pe.dwSize = sizeof(PROCESSENTRY32);
     
            BOOL bRet = Process32First(hSnapshot, &pe);
     
            while (bRet)
            {
                if (!_stricmp(pe.szExeFile, szExeName))
    Sous code:blocks compile parfaitement. Alros que sous Visual studio, _stricmp me sort l'erreur que j'ai donné avant. Quel est la différence entre les deux compilateurs?

    Sinon, je fais ma conversion avec wctombs, mais ca me renvoit toujours 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wctomb_s(&retour, pedst, MB_CUR_MAX, *pe.szExeFile);

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Blo0d4x3 Voir le message
    Sous code:blocks compile parfaitement. Alros que sous Visual studio, _stricmp me sort l'erreur que j'ai donné avant. Quel est la différence entre les deux compilateurs?
    En gros: la fonction _stricmp a des types figés en const char*.
    Mais pas pe.szExeFile qui est un TCHAR, c'est à dire soit un char soit un WCHAR en fonction de si ton projet est en Unicode ou pas.

    Par contre, tu ne donnes pas le type pour szExeName.


    Citation Envoyé par Blo0d4x3 Voir le message
    Sinon, je fais ma conversion avec wctombs, mais ca me renvoit toujours 0
    Lis la documentation : "Return Value: Zero if successful, an error code on failure. "

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par Blo0d4x3 Voir le message
    Sinon, je fais ma conversion avec wctombs, mais ca me renvoit toujours 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wctomb_s(&retour, pedst, MB_CUR_MAX, *pe.szExeFile);
    Fais attention: wctomb_s() ne convertit qu'un seul caractère. C'est vraiment ce que tu veux faire ?

    D'une manière plus générale, es-tu sûr d'avoir bien compris le problème que tu rencontres ?
    Par exemple, si ton but est de comparer le nom de l'exécutable, alors peut-être pourrais tu faire cette comparaison directement à partir de la chaîne en WCHAR ?
    Dans ce cas, il y a une variante de stricmp() qui fait ça :
    _wcsicmp, dont voici la documentation sur MSDN: http://msdn.microsoft.com/fr-fr/library/k59z8dwe.aspx.
    Mon opinion c'est que parfois c'est mieux de travailler directement avec ce que te donne ton système, plutôt que de rajouter du code qui fait des conversions. Evidemment, je ne sais rien de ton projet et peut-être qu'il y a un tas de bonnes raisons pour que tu fasses cette conversion.

  6. #6
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Arf oui, _wcsicmp sera mieux..

    J'ai modifier comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (!_wcsicmp(pe.szExeFile, szExeName))
    Le pour le coup il rale car je passe un PCHAR ou lieu de const char*

    En faire je recherche le pid d'un process. Le code qui fonctionnait sous code:blocks appel la fonction GetProcessId

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DWORD GetProcessId(IN PCHAR szExeName)
    Et c'est dans cette fonction que je fais le _wcsicmp.

    Ca fait longtemps que j'ai pus fait du C, et je me rend compte que j'ai du mal avec le casting

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Ca fait longtemps que j'ai pus fait du C, et je me rend compte que j'ai du mal avec le casting
    Invite-moi !! je suis comédien et suivant le scénario je peux jouer dans ton film.

    Blague à part, ce n'est pas un problème de casting, mais plutôt de conversion.
    Si tu veux garder le même prototype pour ta fonction GetProcessId(), alors tu dois bien convertir. Maintenant, à toi de décider si tu convertit l'entrée de GetProcessId() ou le contenu de pe.szExeName.

  8. #8
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    Invite-moi !! je suis comédien et suivant le scénario je peux jouer dans ton film.


    J'ai opté pour modifier ma fonction, j'en ai profité pour changer son nom afin éviter de faire doublon avec celle de l'API.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DWORD GetProcId(const wchar_t* szExeName)
    Je l'appel comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DWORD ID = GetProcId(L"notepad.exe");
    La fonction marche, elle me renvoi le bon PID.

    Merci pour ton coup de main, la conversion de variable, unicode etc... ça me rends fou

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, j'utiliserais plutôt les TCHAR, qui prendont le bon type selon les options du projet (et au passage, seront adaptables pour un éventuel changement de type futur):
    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
    #include <tchar.h>
     
    DWORD GetProcId(const TCHAR* szExeName)
    {
    DWORD dwRet = 0;
        DWORD dwCount = 0;
     
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     
        if (hSnapshot != INVALID_HANDLE_VALUE)
        {
            PROCESSENTRY32 pe = {0};
            pe.dwSize = sizeof(PROCESSENTRY32);
     
            BOOL bRet = Process32First(hSnapshot, &pe);
     
            while (bRet)
            {
                //Note: le retour de strcmp() n'est pas booléen, une comparaison explicite à zéro est donc plus claire
                if (_tcsicmp(pe.szExeFile, szExeName)==0)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/05/2011, 10h57
  2. Tableau de pointeurs const char *
    Par matafan dans le forum C
    Réponses: 5
    Dernier message: 26/11/2008, 14h32
  3. Réponses: 6
    Dernier message: 28/10/2005, 12h11
  4. convertir tableau d'entier en char[]
    Par nin47 dans le forum C
    Réponses: 20
    Dernier message: 12/10/2005, 20h03
  5. Réponses: 13
    Dernier message: 06/03/2005, 15h21

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