Domanda

I sembrano avere un po 'un problema TESTO / UNICODE quando si utilizza la funzione CreateFile finestre per affrontare una porta seriale. Qualcuno può per favore punto di aiuto il mio errore?

Sto scrivendo un'applicazione console Win32 in VC ++ utilizzando VS 2008.

I creare un handle per affrontare la porta seriale in questo modo:

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

Questo funziona bene (è richiesto il bit \\\\.\\ per confacenti allo maggiori di COM9 e opere per quelli fino a COM9 anche). Il problema è che la mia porta com non sarà sempre COM20, quindi mi piacerebbe avere all'utente di specificare di cosa si tratta.

Qui ci sono alcune cose che ho provato:

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

Questa non compilare e restituisce l'errore: Errore C2664: 'CreateFileW': non è in grado di convertire il parametro 1 da 'std :: string' a 'LPCWSTR'

ho pensato che forse specificando CreateFileA avrebbe funzionato allora, ma che ha dato fondamentalmente lo stesso errore.

Ho anche provato:

/*
everything else the same
*/   

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

che pure non può essere compilato e ritorni: Errore C2065: 'LcomID': identificatore non dichiarato

Io non sono molto di un esperto, ma ho lavorato su questo per un po 'di tempo. Qualcuno può dirmi come sostituire L"\\\\.\\COM20" in tal modo un che l'utente può specificare la porta com e in modo che CreateFile continueranno a funzionare? Grazie!

È stato utile?

Soluzione

È possibile utilizzare std::wstring e std::wcin, std::wcout per eseguire ingresso direttamente in "stringhe Unicode", oppure si può guardare in di Microsoft funzioni di conversione .

Se si va per l'opzione 1 ° (consigliato), è comunque necessario utilizzare la funzione c_str() per ottenere l'accesso ad un valore LPCWSTR (puntatore a const wchar_t).

soluzione del campione (anche non usa la sintassi di CreateFileW, per evitare problemi con le 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;
}

Altri suggerimenti

Se si desidera continuare a utilizzare std::string, quindi utilizzare il suo metodo c_str() quando si chiama CreateFileA(), ad esempio:

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

Come ulteriore riferimento, hanno uno sguardo alle conversioni ATL macro (ad esempio: CA2CW, etc.). Questi (se usato correttamente) in grado di gestire praticamente tutti i casi semplici di conversione in linea, con poca confusione.

Nel tuo esempio, è possibile utilizzare std :: string, quindi utilizzare:

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

Se (per qualche motivo) si decide di continuare a lavorare con le stringhe ANSI, allora date un'occhiata alla funzione MultiByteToWideChar. Ma stringhe ANSI sono praticamente obsoleti.

mi sono imbattuto in questo di recente. Ho semplicemente disabile Unicode, come Unicode era del tutto fuori portata per questa applicazione.

Informazioni generali sulle conversioni stringa qui: http://www.codeproject.com/KB /string/cppstringguide2.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top