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 :

const char * vers TCHAR


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut const char * vers TCHAR
    Bonjour,

    Je reprends actuellement des exemples issues d'un livre du précédent millénaire :

    Je rencontre souvant des déclaration telles que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static TCHAR* szPointer  = TEXT("Pointed text")
    Et j'obtiens une erreur comme quoi un const char * ne peut pas être utilisé pour initialiser pour le type TCHAR.

    Pouvez-vous m'expliquer plus en détail ce que siginifie cette erreur ? Peut-être y-a-t'il des paramètrages (Multi-Byte Char Set,...) dans Visual Studio (j'utilise la version la plus récente) pour éviter de faire appel à une myriade de librairies externes ?

    Ps : à l'avenir je passerai tout en Unicode, mais pour l'instant je préfère suivre les examples au plus près.

    Merci par avance !

  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
    TCHAR est un typedef pour l'API Microsoft qui permet de choisir entre le type char (ASCII) et wchar_t (unicode - UTF-16).
    De même TEXT est une macro pour l'API Microsoft qui permet de choisir entre rien "XXXX" (ASCII) et L L"XXXX" (unicode - UTF-16).

    Ton problème est le fait que TEXT("Pointed text") est une chaîne constante et comme elle est constante, le compilateur refuse de la mettre dans une chaîne non constante.

    Il faut faire un truc comme static LPCTSTR szPointer = TEXT("Pointed text")

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Merci, ça fonctionne parfaitement . En fait, j'avais omis de préciser que je me passe sur le libre Windows Programming de Charles Petzold qui ne traite normalement que du C, mais bon je présume que l'erreur ne venait pas de là.

    En fait, je commençais à doute avec ce que constitue la libraire "TCHAR.H", mais celle-ci ne semble pas liée... Bon OK, il faut aussi que je revoie ce qu'est un typedef et les macros .

    Une autre petite question. Comment on fait pour insérer du code dans du texte, sans que ça crée en quelque sorte un paragraphe ?

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    En C++ c'est une erreur d'écrire char* szPointer = "Pointed text"; mais en C ça n'est qu'un warning. C'est très mal d'écrire ça (surtout si on veut enseigner le C!) mais c'est correct. La raison est historique. Maintenant ça fait 30 ans que le mot const n'est pas exigé en C pour un pointeur sur une chaîne littérale, il serait temps que le C évolue.

  5. #5
    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 Orbeaman Voir le message
    livre Windows Programming de Charles Petzold qui ne traite normalement que du C
    Normal Charles Petzold était expert sur la programmation d'applications Windows (<- si je ne dis pas de bêtises , parce que moi aussi je dois avoir son livre quelque part sur un disque dur)
    Et donc ce livre traite de la Win32/ WinAPI, cette bibliothèque est programmée en C (avant la norme C99, c'est pour cela que ce n'est pas toujours très propre).
    Pour du C++ (avant la norme C++98, c'est pour cela que ce n'est pas toujours très propre), il faut coder avec les bibliothèques MFC, l'ATL/ WTL qui sont juste des surcouches objet de cette bibliothèque Win32/ WinAPI
    Mais depuis, il y a eu les bibliothèques WinForms, WPF, Silverlight et Xamarin.
    Et après vérification, ce livre date de 1990 mais à dû avoir plusieurs (ré)éditions


    Citation Envoyé par Orbeaman Voir le message
    Une autre petite question. Comment on fait pour insérer du code dans du texte, sans que ça crée en quelque sorte un paragraphe ?
    C'est le code codeinline ou juste c pour la version simplifiée (code qu'on met entre crochets et crochets/slash pour le code qui ferme).
    Regarde comment on met en gras, souligné ... et c'est la même chose. Tu peux citer un message et voir comment il est fait également (<- si je ne dis pas de bêtises )

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Merci pour ces précisions. Il s'agit de la version 5 de 1998 (il y a une nouvelle version de 2013 plus orientée C#). Je l'ai prise en Kindle et je suis agréablement surpris par la qualité du document , même si l'API Windows telle que présentée est très certainement désuette par rapport à ce qui ce fait de nos jours... La prochaine étape sera de creuser les aspects COM (https://docs.microsoft.com/en-us/win...indows-program), Direct2D et bien sûr, je prévois aussi d'apprendre à coder avec des technologies plus modernes (bon OK, il y a probablement les 3 / 4 des technologies que je ne soupçonne même pas ). Pour l'instant, j'apprends surtout à coder avec l'API Windows pour les apprendre les bases et pour pouvoir l'utiliser depuis VBA (ce n'est pas une finalité en soi), mais je souhaite creuser avec C / C++ car il y a des concepts que je ne maitrise pas vraiment (tooltips et menus).

    D'accord, c'est juste que la balise codeinline ne me semble pas accessibles depuis les boutons du forum.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Pour poursuivre mon élan dans la compéhension de l'API Windows, pouvez-vous me dire si de manière générale, toute application Windows passe par l'API ?

    D'un côté, je pense que oui en considérant l'API comme l'une des plus basses couches logicielles (même s'il y en doit en avoir bien d'autres avant d'arrive au code machine ). En fait, j'aimerais aussi "piloter" (ie récupérer les divers handles et envoyer des messages) une application qui avait été codée en JAVA via la librairie AWT. Visiblement, je m'obtiens guère de succès, peut-être à cause de la machine virtuelle ? Ou dois-je en conclure que ce qui est "pilotable" ait forcément été codé en C / C++ ?

    Merci encore !

  8. #8
    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
    Je n'ai sais rien

    Par contre voici du code pour trouver les zones de texte des applications ouvertes (c'est pour afficher le texte en clair lorsque l'édition est masquée : 30 lignes qui fonctionnent depuis 20 ans )
    Avec ce code tu peux voir si tu trouves ta fénêtre Java

    Voici 3 fonctions qui sont des callbacks :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    // Quick && Dirty : globals
    wchar_t little_buffer[128];
     
     
    HWND app_window;
    //---------------------------------------------------------------------------
    BOOL CALLBACK find_window_java(HWND one_window, LPARAM)
    {
    	UnicodeString window_text;
    	bool ret;
     
    	if ( GetWindowText(one_window, little_buffer, 128) > 0) {
    		window_text = little_buffer;
     
    		if (window_text == L"Java Application") {
    			app_window = one_window;
     
    			ret = false;
    		} else {
    			ret = true;
    		}
     
    //		main_form->memo_result->Lines->Add(window_text);
    	} else {
    		ret = true;
     
    //		main_form->memo_result->Lines->Add(L"????");
    	}
     
    	return ret;
    }
    //---------------------------------------------------------------------------
    BOOL CALLBACK find_window_java_pid(HWND one_window, LPARAM pid)
    {
    	DWORD window_pid;
     
    	bool ret;
     
    	/**/ GetWindowThreadProcessId(one_window, &window_pid);
     
    	if (window_pid == (DWORD) pid) {
    		app_window = one_window;
     
    		ret = false;
    	} else {
    		ret = true;
    	}
     
    //	main_form->memo_result->Lines->Add(IntToStr((int) window_pid));
     
    	return ret;
    }
    //---------------------------------------------------------------------------
    BOOL CALLBACK find_edits(HWND one_child, LPARAM has_verbose)
    {
    	UnicodeString child_str, child_class;
     
    	if (has_verbose == 1) {
    		if ( GetWindowText(one_child, little_buffer, 128) > 0) {
    			child_str = little_buffer;
    		} else {
    			child_str = L"???";
    		}
    	}
     
    	if ( GetClassName(one_child, little_buffer, 128) > 0) {
    		child_class = little_buffer;
     
    		if (child_class == L"TEdit") {
    			if (main_form->radio_button_show->Checked) {
    				SendMessage(one_child, EM_SETPASSWORDCHAR, L'\0', 0);
    			} else {
    				SendMessage(one_child, EM_SETPASSWORDCHAR, L'', 0);
    			}
    		}
    	} else {
    		child_class = L"???";
    	}
     
    	child_str = (child_str + L" - " + child_class);
     
    //	if (has_verbose == 1) { main_form->memo_result->Lines->Add(child_str); }
     
    	return true;
    }
    //---------------------------------------------------------------------------

    Et on les appelle comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /**/ EnumWindows(&find_window_java, 0);
     
     
    DWORD pid = StrToInt(edit_window_id->Text);
    /**/ EnumWindows(&find_window_java_pid, pid);
     
     
    /**/ EnumChildWindows(app_window, &find_edits, ((has_verbose)? 1 :0));

    Édit : Arf j'ai fait cela avec Embarcadero. Peut-être remplacer le type UnicodeString par std::wstring et également le gros boule BOOL par soit le petit bool soit unsigned char

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

Discussions similaires

  1. Conversion const char* vers std::string
    Par scheme dans le forum C++
    Réponses: 4
    Dernier message: 21/09/2010, 11h02
  2. Conversion de char vers const char
    Par Lucas Panny dans le forum Visual C++
    Réponses: 9
    Dernier message: 01/09/2008, 16h36
  3. Erreur de 'TCHAR [256]' en 'const char *'
    Par Erakis dans le forum MFC
    Réponses: 10
    Dernier message: 17/07/2008, 18h45
  4. [MFC] CString vers const char*
    Par Rafoo dans le forum MFC
    Réponses: 9
    Dernier message: 17/06/2006, 15h43
  5. [MFC - ATL] CString vers const char *
    Par VitamineC dans le forum MFC
    Réponses: 2
    Dernier message: 12/04/2006, 18h56

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