【发布时间】:2010-09-24 02:31:28
【问题描述】:
在使用 Windows CreateFile 函数寻址串行端口时,我似乎遇到了一些 TEXT / 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 的端口)。问题是我的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;
}
这不会编译并返回错误:error C2664: 'CreateFileW' : cannot convert parameter 1 from 'std::string' to 'LPCWSTR'
我认为也许指定 CreateFileA 会起作用,但这给出了基本相同的错误。
我也试过了:
/*
everything else the same
*/
hSerial = CreateFile( TEXT(comID),
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
也不编译并返回:error C2065: 'LcomID' : undeclared identifier
我不是什么专家,但我已经在这方面工作了一段时间。有人可以告诉我如何替换 L"\\\\.\\COM20" 以使用户可以指定 comport 并且 CreateFile 仍然可以工作吗?谢谢!
【问题讨论】:
标签: c++ string unicode createfile