eine Zeichenfolge LPCWSTR für Createfile () Umwandeln einer seriellen Schnittstelle zu adressieren

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

Frage

Ich scheine ein bisschen ein TEXT / UNICODE Problem zu haben, wenn die Fenster Funktion Create zur Adressierung über eine serielle Schnittstelle. Kann jemand helfen Punkt aus meinem Fehler bitte?

Ich bin eine Win32-Konsole-Anwendung in VC ++ Schreiben VS 2008 verwenden.

Ich kann einen Griff erstellen die serielle Schnittstelle wie diese Adresse:

#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;
}

Werke, die ganz gut (das \\\\.\\ Bit für comports erforderlich größer als COM9 und Arbeiten für auch COM9 diejenigen nach oben). Das Problem ist, dass mein comport nicht immer COM20, so dass ich den Benutzer haben möchte angeben, was es ist.

Hier sind einige Dinge, die ich versucht habe:

#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;
}

Das lässt sich nicht kompilieren und gibt den Fehler: Fehler C2664: 'CreateFileW': kann Parameter 1 von 'std :: string' nicht konvertieren 'LPCWSTR'

Ich dachte, vielleicht CreateFileA spezifizieren dann funktionieren würde, aber das gab im Grunde den gleichen Fehler.

Ich habe auch versucht:

/*
everything else the same
*/   

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

, die auch nicht nicht kompiliert und kehrt: Fehler C2065: 'LcomID': nicht deklarierter Bezeichner

Ich bin nicht viel von einem Experten, aber ich habe für eine Weile auf diese gearbeitet. Kann mir jemand sagen, wie L"\\\\.\\COM20" in einer solchen Art und Weise zu ersetzen, dass der Benutzer die comport angeben und damit Createfile wird immer noch funktionieren? Dank!

War es hilfreich?

Lösung

können Sie entweder std::wstring und std::wcin, std::wcout Eingang auszuführen direkt in „Unicode-Strings“, oder Sie können ein href Blick in die Microsoft <= "http://msdn.microsoft.com/en-us/library/bb202786 aspx“rel = "noreferrer"> Konvertierungsfunktionen .

Wenn Sie die erste Option zu gehen (empfohlen), müssen Sie noch die c_str() Funktion zu erhalten Zugriff auf einen LPCWSTR Wert (Zeiger auf const wchar_t) verwenden.

Probenlösung (auch nicht von CreateFileW Syntax verwenden, mit UNICODE Makroprobleme zu vermeiden):

#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;
}

Andere Tipps

Wenn Sie den Vorgang fortsetzen möchten std::string verwenden, dann seine c_str() Methode verwenden, wenn Sie anrufen CreateFileA(), zum Beispiel:

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

Als weitere Referenz, hat einen Blick auf dem ATL-Conversions-Makros (zB: CA2CW, etc.). Diese (wenn sie richtig verwendet wird) verarbeiten kann so ziemlich alle einfache Konvertierung Fälle inline, mit wenig Aufwand.

In Ihrem Beispiel können Sie std :: string verwenden, dann verwenden:

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

Wenn (aus irgendeinem Grund) Sie entscheiden, mit ANSI-Zeichenfolgen weiter zu arbeiten, dann nehmen Sie einen Blick auf die MultiByteToWideChar Funktion. Aber ANSI-Zeichenfolgen sind so ziemlich überflüssig.

Ich lief vor kurzem in diesen. Ich habe einfach deaktiviert Unicode, als Unicode vollständig außerhalb des Bereichs für diese Anwendung war.

Allgemeine Informationen zu Zeichenfolge-Konvertierungen hier: http://www.codeproject.com/KB /string/cppstringguide2.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top