当使用Windows CreateFile函数来解决串行端口时,我似乎有一些文本 / Unicode问题。有人可以帮助指出我的错误吗?

我正在使用VS 2008在VC ++中编写Win32控制台应用程序。

我可以创建一个句柄来解决这样的串行端口:

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

效果很好( \\\\.\\ 比com9大于com9所需的位,并且也适用于com9的人)。问题是我的comport并不总是是com20,所以我想让用户指定它是什么。

这是我尝试过的一些事情:

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

这不会编译并返回错误: 错误C2664:'CreateFileW':无法从'std :: String'转换为'lpcwstr'的参数1

我认为可能指定CreateFilea会起作用,但这基本上给出了相同的错误。

我也尝试了:

/*
everything else the same
*/   

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

它也不会编译并返回: 错误C2065:'lcomid':未申报的标识符

我不是一个专家,但我已经从事这个工作了一段时间。有人可以告诉我如何替换吗 L"\\\\.\\COM20" 以用户可以指定comport的方式,并且CreateFile仍然可以正常工作?谢谢!

有帮助吗?

解决方案

您可以使用 std::wstringstd::wcin, std::wcout 要直接在“ Unicode字符串”中执行输入,或者您可以查看Microsoft的 转换功能.

如果您选择第一选项(建议),您仍然需要使用 c_str() 功能可以访问 LPCWSTR 价值(指向 const wchar_t).

样品解决方案(也不使用 CreateFileW 语法,以防止问题 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;
}

其他提示

如果您想继续使用 std::string, ,然后使用它 c_str() 打电话时的方法 CreateFileA(), ,例如:

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

作为附加参考,请查看ATL转换宏(例如:CA2CW等)。这些(如果正确使用)几乎可以处理所有简单的转换案例,那么几乎没有大惊小怪。

在您的示例中,您可以使用std :: string,然后使用:

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

如果(由于某种原因)您决定继续使用ANSI字符串,请看一下 MultiByteToWideChar 功能。但是ANSI字符串几乎已经过时了。

我最近遇到了这个。我只是简单地禁用Unicode,因为Unicode完全不超出此应用程序的范围。

有关字符串转换的一般信息: http://www.codeproject.com/kb/string/cppstringguide2.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top