Joh*_*ohn 4 c++ string unicode createfile
当使用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;
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作(\\\\.\\对于大于COM9的comports来说,这个位是必需的,对于那些直到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;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译并返回错误:错误C2664:'CreateFileW':无法将参数1从'std :: string'转换为'LPCWSTR'
我想也许指定CreateFileA会工作,但这给了基本相同的错误.
我也尝试过:
/*
everything else the same
*/
hSerial = CreateFile( TEXT(comID),
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);`
Run Code Online (Sandbox Code Playgroud)
它也不编译并返回:错误C2065:'LcomID':未声明的标识符
我不是一个专家,但我一直在研究这个问题.有人能告诉我如何以L"\\\\.\\COM20"这样的方式替换用户可以指定comport并使CreateFile仍然有效吗?谢谢!
您可以使用std::wstring和std::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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19870 次 |
| 最近记录: |