Pregunta

Me parece estar teniendo un poco de un problema TEXTO / UNICODE cuando se utilizan las ventanas de función CreateFile para hacer frente a un puerto serie. Por favor alguien puede ayudar a mi punto de error?

Estoy escribiendo una aplicación de consola Win32 en VC ++ utilizando VS 2008.

Me puede crear un identificador para hacer frente al puerto serie como esta:

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

Esto funciona muy bien (se requiere el bit \\\\.\\ para comports mayor que COM9 y obras para los que hasta COM9 también). El problema es que mi puerto com no siempre será COM20, así que me gustaría tener al usuario especificar lo que es.

Aquí hay algunas cosas que he intentado:

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

Esto no se compila y devuelve el error: Error C2664: 'CreateFileW': no ??se puede convertir el parámetro 1 de 'std :: string' a 'LPCWSTR'

pensé que tal vez especificando CreateFileA funcionaría entonces, pero que dio básicamente el mismo error.

También intentó:

/*
everything else the same
*/   

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

que también no se compila y vuelve: error C2065: 'LcomID': no ??declarado identificador

No soy mucho de un experto, pero he estado trabajando en esto durante un tiempo. ¿Puede alguien decirme cómo sustituir L"\\\\.\\COM20" de tal manera que el usuario puede especificar el puerto com y para que CreateFile seguirá funcionando? Gracias!

¿Fue útil?

Solución

También se puede usar std::wstring y std::wcin, std::wcout a realizar la entrada directamente en las "cadenas Unicode", o se puede mirar en de Microsoft funciones de conversión .

Si vas por la primera opción (recomendada), que todavía tienen que utilizar la función c_str() a obtener acceso a un valor LPCWSTR (puntero a const wchar_t).

solución de muestra (también no uso de sintaxis CreateFileW, para evitar problemas con la 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;
}

Otros consejos

std::string Si desea seguir utilizando c_str(), a continuación, utilizar su método CreateFileA() al llamar, por ejemplo:

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

Como referencia adicional, echar un vistazo a las conversiones ATL macros (por ejemplo: CA2CW, etc.). Estos (si se utiliza correctamente) pueden manejar prácticamente todos los casos de conversión en línea simples, con poco ruido.

En el ejemplo, se puede utilizar std :: string, a continuación, utilice:

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

Si (por alguna razón) decide continuar trabajando con cadenas ANSI, a continuación, echar un vistazo a la función MultiByteToWideChar. Pero las cadenas ANSI son más o menos obsoleta.

me encontré con esto recientemente. Simplemente discapacitados Unicode, como Unicode era totalmente fuera del alcance de esta aplicación.

Información General sobre la conversión de series aquí: http://www.codeproject.com/KB /string/cppstringguide2.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top