La conversion d'une chaîne à LPCWSTR pour CreateFile () pour répondre à un port série
-
05-10-2019 - |
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!
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