C++ 将CreateFile()的字符串转换为LPCWSTR以寻址串行端口

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

在使用windows CreateFile函数寻址串行端口时,我似乎遇到了一点文本/UNICODE问题。有人能帮我指出我的错误吗

我正在用VS2008用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;
}
这不会编译并返回错误:错误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(), ...);