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

 C++ Discussion :

problème de conversion std::string a const wchar_t*


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut problème de conversion std::string a const wchar_t*
    Bonjours,

    Je sui confronter a un problème qui semble être lier a l'unicode ou ACII,

    l
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
    std::wstring test=L"data";
    int Ret = SetProcessPriority(test.c_str(),BELOW_NORMAL_PRIORITY_CLASS);
    }
    il existerait des variantes qui devrais remplacer ce problème SetProcessPriorityA et SetProcessPriorityW

    Que j'utilise c_str() ou les diferrente macro(fonction SetProcessPriority ,SetProcessPriorityA ,SetProcessPriorityW) non n'y change rien.

    Je ne sais pas en quoi ça compile ( enfin sou code block) ou si c' est juste le format du fichier (main.cpp) pour le format acii ou unicode ou un paramètre doit être passer à gcc ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error: invalid conversion from 'const wchar_t*' to 'PWSTR {aka wchar_t*}' [-fpermissive]|
    Cordialment,

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 770
    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 770
    Par défaut
    Effectivement, un wstring à la place d'une chaîne de caractères de type LPTSTR (et donc LPWSTR en Unicode) doit nécessiter des tests et de la documentation pour voir si le "mariage" prend

    Mais ton problème est un problème purement C++ : constness.
    En gros la méthode wstring::c_str() retourne une chaîne de caractères constante (la classe refuse que tu modifies cette chaîne directement, via l'emplacement mémoire) mais le compilateur ne l'accepte pas parce que la fonction/ macro SetProcessPriority peut la modifier.

    basic_string::c_str :
    A program shall not alter any of the characters in this sequence.

    const_cast<>()

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    C'est un des rares cas où const_cast est utile, parce que ces APIs pour quelconque raison prennent des (w)char(_t)* et non des const (w)char(_t)* mais ne modifient généralement pas la chaîne pour autant.. (à vérifier dans la doc cela dit..)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Je ne connaissais pas cette méthode et n'est pas documentée dans les 2 livres que j'ustilises. ça pourrai servir pour la faq

    const_cast<>()

    je vais voir comment on s'en sert parce que sans doc c'est plus compliquer

    merci pour vos réponses

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Pour couper court à toute vilaine pratique, panthere noire nous a fourni ladite fonction sur le chat, ce n'est pas une fonction pré-existante mais une fonction qu'il 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    void SetProcessPriorityA(PWSTR ProcessName, int Priority)
    {
        PROCESSENTRY32 proc32;
     
        HANDLE hSnap;
     
        //if (hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
        hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hSnap == INVALID_HANDLE_VALUE)
        {
     
        }
        else
        {
            proc32.dwSize = sizeof(PROCESSENTRY32);
            while ((Process32Next(hSnap, &proc32)) == TRUE)
            {
     
                std::string T1= proc32.szExeFile;
                //std::string T2= ProcessName;
      /*          if (_wcsicmp(proc32.szExeFile, ProcessName) == 0)
                {
                    HANDLE h = OpenProcess(PROCESS_SET_INFORMATION ,TRUE, proc32.th32ProcessID);
                    SetPriorityClass(h, BELOW_NORMAL_PRIORITY_CLASS);
                    CloseHandle(h);
    */        }
        }
            CloseHandle(hSnap);
    }
    Donc, comme dragonjoker59 et moi-même te l'avons conseillé, utilise à bon escient le type TCHAR afin de t'affranchir de la contrainte A/W :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using tstring = std::basic_string<TCHAR>;
    et passe un const tstring & à ta fonction à la place du PWSTR (=wchar_t* là où test.c_str() est de type const wchar_t*), ainsi que sur la ligne std::string T1= proc32.szExeFile;.

    Puis utilise la macro TEXT() pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Ret = SetProcessPriority(TEXT("data"), BELOW_NORMAL_PRIORITY_CLASS);

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    J'ai fait les modifications vous m'avez proposé,enfin si j'ai rien rater

    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
     
    #include <stdio.h>
    #include <windows.h>
    #include <tlhelp32.h>
    #include <iostream>
    #include  <fstream>
    #include <tchar.h>
    #include "listing_process.hpp"
    #include "setpriority.hpp"
    using namespace std;
     
    //typedef char* PSTRING;
    using tstring = std::basic_string<TCHAR>;
     
    //void SetProcessPriorityW(PWSTR ProcessName, int Priority)
    void SetProcessPriority(const tstring &, int Priority)
    {
        PROCESSENTRY32 proc32;
     
        HANDLE hSnap;
     
        //if (hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
        hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hSnap == INVALID_HANDLE_VALUE)
        {
     
        }
        else
        {
            proc32.dwSize = sizeof(PROCESSENTRY32);
            while ((Process32Next(hSnap, &proc32)) == TRUE)
            {
     
                const tstring & T1= proc32.szExeFile;
                //std::string T2= ProcessName;
      /*          if (_wcsicmp(proc32.szExeFile, ProcessName) == 0)
                {
                    HANDLE h = OpenProcess(PROCESS_SET_INFORMATION ,TRUE, proc32.th32ProcessID);
                    SetPriorityClass(h, BELOW_NORMAL_PRIORITY_CLASS);
                    CloseHandle(h);
    */        }
        }
            CloseHandle(hSnap);
    }
     
     
     
     
    int main()
    {
    	SetProcessPriority(TEXT("data"),BELOW_NORMAL_PRIORITY_CLASS);
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ||=== Build: Debug in ControlProcess (compiler: GNU GCC Compiler) ===|
    |14| error: expected nested-name-specifier before 'tstring'|
    |17|error: 'tstring' does not name a type|
    ||In function 'void SetProcessPriority(const int&, int)':|
    |35|error: 'tstring' does not name a type|
    ||In function 'int main()':|
    |58|error: invalid conversion from 'const char*' to 'int' [-fpermissive]|
    |17|note:   initializing argument 1 of 'void SetProcessPriority(const int&, int)'|

  7. #7
    Invité
    Invité(e)
    Par défaut
    using alias = type; c'est du C++11. Soit tu actives l'option, soit tu utilises typedef à la place.

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

Discussions similaires

  1. Problème de conversion const
    Par Gaspoute dans le forum C++
    Réponses: 17
    Dernier message: 10/01/2012, 21h26
  2. conversion const std::string et const char * ?
    Par panthere noire dans le forum C++
    Réponses: 7
    Dernier message: 28/02/2011, 15h51
  3. (Problème avec...) conversion de std::string en char
    Par crossbowman dans le forum SL & STL
    Réponses: 7
    Dernier message: 05/03/2006, 19h54
  4. Problème de conversion unicode
    Par djmalo dans le forum C
    Réponses: 5
    Dernier message: 09/03/2004, 11h48
  5. Réponses: 11
    Dernier message: 02/09/2003, 14h20

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