La conversion d'une chaîne à LPCWSTR pour CreateFile () pour répondre à un port série

StackOverflow https://stackoverflow.com/questions/3783842

Question

Je semblent avoir un peu d'un problème TEXTE / UNICODE lorsque vous utilisez les fenêtres de fonction CreateFile pour adresser un port série. Quelqu'un peut-il point d'aide mon erreur?

J'écris une application console Win32 dans VC ++ en utilisant VS 2008.

Je peux créer une poignée pour résoudre le port série comme ceci:

#include <iostream>    
#include <windows.h>
#include <string>

int main()
{

   HANDLE hSerial;

   hSerial = CreateFile( L"\\\\.\\COM20",
                         GENERIC_READ | GENERIC_WRITE,
                         0,
                         0,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);`

   return 0;
}

Cela fonctionne très bien (le bit \\\\.\\ est nécessaire pour compotiers plus que COM9 et œuvres pour ceux à COM9 aussi). Le problème est que mon comport ne sera pas toujours COM20, donc je voudrais préciser que l'utilisateur ce qu'il est.

Voici quelques choses que j'ai essayé:

#include <iostream>    
#include <windows.h>
#include <string>

int main()
{
   std::string comNum;
   std::cout << "\n\nEnter the port (ex: COM20): ";
   std::cin >> comNum;
   std::string comPrefix = "\\\\.\\";
   std::string comID = comPrefix+comNum;

   HANDLE hSerial;

   hSerial = CreateFile( comID,
                         GENERIC_READ | GENERIC_WRITE,
                         0,
                         0,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);`

   return 0;
}

Cela ne compile pas et renvoie l'erreur: Erreur C2664: 'CreateFileW': ne peut pas convertir le paramètre 1 de 'std :: string' à 'LPCWSTR'

Je pensais que peut-être préciser CreateFileA fonctionnerait alors, mais qui a donné essentiellement la même erreur.

J'ai essayé aussi:

/*
everything else the same
*/   

hSerial = CreateFile( TEXT(comID),
                      GENERIC_READ | GENERIC_WRITE,
                      0,
                      0,
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      0);`

qui également ne pas compiler et retourne: error C2065: 'LcomID': identificateur non déclaré

Je ne suis pas beaucoup d'un expert, mais je travaille sur cette question depuis un certain temps maintenant. Quelqu'un peut-il me dire comment remplacer L"\\\\.\\COM20" de manière à ce que l'utilisateur peut spécifier le comport et que CreateFile continueront à fonctionner? Merci!

Était-ce utile?

La solution

Vous pouvez utiliser std::wstring et std::wcin, std::wcout pour effectuer l'entrée directement en « chaînes unicode », ou vous pouvez regarder dans Microsoft fonctions de conversion .

Si vous optez pour la 1ère option (recommandé), vous avez encore besoin d'utiliser la fonction c_str() d'accès de gain à une valeur de LPCWSTR (pointeur sur const wchar_t).

Solution d'échantillon (utilisez pas non plus de la syntaxe CreateFileW, pour éviter les problèmes avec macro UNICODE):

#include <iostream>    
#include <windows.h>
#include <string>

int main()
{
   std::wstring comNum;
   std::wcout << L"\n\nEnter the port (ex: COM20): ";
   std::wcin >> comNum;
   std::wstring comPrefix = L"\\\\.\\";
   std::wstring comID = comPrefix+comNum;

   HANDLE hSerial;

   hSerial = CreateFileW( comID.c_str(),
                     GENERIC_READ | GENERIC_WRITE,
                     0,
                     0,
                     OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL,
                     0);`

   return 0;
}

Autres conseils

Si vous voulez continuer à utiliser std::string, utilisez sa méthode c_str() lors de l'appel CreateFileA(), par exemple:

hSerial = CreateFileA( comID.c_str(), ...);

En tant que référence supplémentaire, ont un regard sur les macros conversions ATL (par exemple: CA2CW, etc.). Ceux-ci (si elle est utilisée correctement) peut gérer à peu près tous les cas simples de conversion en ligne, avec peu d'agitation.

Dans votre exemple, vous pouvez utiliser std :: string, puis utilisez:

CreateFile( CA2CT( comID.c_str() ), ... );

Si (pour une raison quelconque), vous décidez de continuer à travailler avec des chaînes ANSI, alors jetez un oeil à la fonction MultiByteToWideChar. Mais les chaînes ANSI sont à peu près obsolètes.

je suis tombé récemment. Je Unicode simplement désactivé, comme Unicode était totalement hors de portée pour cette application.

Informations générales sur les conversions de chaînes ici: http://www.codeproject.com/KB /string/cppstringguide2.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top