C++ 将CreateFile()的字符串转换为LPCWSTR以寻址串行端口
在使用windows CreateFile函数寻址串行端口时,我似乎遇到了一点文本/UNICODE问题。有人能帮我指出我的错误吗 我正在用VS2008用VC++编写一个Win32控制台应用程序 我可以创建一个句柄来寻址串行端口,如下所示:C++ 将CreateFile()的字符串转换为LPCWSTR以寻址串行端口,c++,string,unicode,createfile,C++,String,Unicode,Createfile,在使用windows CreateFile函数寻址串行端口时,我似乎遇到了一点文本/UNICODE问题。有人能帮我指出我的错误吗 我正在用VS2008用VC++编写一个Win32控制台应用程序 我可以创建一个句柄来寻址串行端口,如下所示: #include <iostream> #include <windows.h> #include <string> int main() { HANDLE hSerial; hSerial = C
#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;
}
这不会编译并返回错误:错误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);`
它也不会编译并返回:错误C2065:'LcomID':未声明的标识符
我不是什么专家,但我已经在这方面工作了一段时间了。有人能告诉我如何替换
L“\\\.\\COM20”
,这样用户就可以指定组件,这样CreateFile仍然可以工作吗?谢谢 您可以使用std::wstring
和std::wcin
,std::wcout
直接在“unicode字符串”中执行输入,也可以查看Microsoft的
如果选择第一个选项(推荐),您仍然需要使用c_str()
函数来访问LPCWSTR
值(指向const wchar\u t
)
示例解决方案(也不使用CreateFileW
语法,以防止UNICODE
宏出现问题):
#包括
#包括
#包括
int main()
{
std::wstring-comNum;
标准:wcout>comNum;
std::wstring comPrefix=L“\\\.\\”;
std::wstring comID=comPrefix+comNum;
处理串行;
hSerial=CreateFileW(comID.c_str(),
一般的读,一般的写,
0,
0,
开放式,
文件\u属性\u正常,
0);`
返回0;
}
作为附加参考,请查看ATL转换宏(例如:CA2CW等)。这些(如果使用得当的话)可以在线处理几乎所有简单的转换情况,而不会引起什么麻烦
在您的示例中,可以使用std::string,然后使用:
CreateFile( CA2CT( comID.c_str() ), ... );
如果(出于某种原因)决定继续使用ANSI字符串,请查看
MultiByteToWideChar
函数。但是ANSI字符串已经过时了。我最近遇到了这个问题。我只是禁用了Unicode,因为Unicode完全超出了此应用程序的范围。如果要继续使用std::string
,请在调用CreateFileA()
时使用其c_str()
方法,例如:
hSerial = CreateFileA( comID.c_str(), ...);
有关字符串转换的一般信息,请参见此处:+1,这足以解决所述问题(串行端口名)。您不能禁用Unicode。这是Windows的本机字符集。您可能选择使用包装器函数,例如
CreateFileA
。您应该知道,他们总是会将参数转换为Unicode(在您的控制之外),然后调用Unicode等效项。@MSalters:#取消Unicode的定义,然后关闭各种宽字符编译设置。这实际上并没有禁用Unicode。正如我所怀疑的那样,#unde
导致CreateFile
被定义为CreateFileA
。这仍然是CreateFileW
的包装。*W
功能不会被此类#定义禁用。较新的API(包括COM)不受此定义的影响;它们总是Unicode。因此,如果您不想处理两个字符集,请选择Unicode only。如果你选择ANSI,你必须考虑如何在幕后与Unicode交互。我遇到了同样的问题。这就解决了问题。谢谢
CreateFile( CA2CT( comID.c_str() ), ... );
hSerial = CreateFileA( comID.c_str(), ...);