Combox字符串格式统统换成UnicodeString类型了,于是有下面的问题:
AnsiString astr;
wchar_t sPort[32];
aStr = "\\\\.\\";
aSstr += ComDevComBox->Items->Strings[ComDevComBox->ItemIndex].cstr(); //假设当前ComBox中选定的内容为:"COM28"
当我使用mbtowc函数时会出现下面两种情况“
int flag = mbtowc(sPort, aStr.c_str(), aStr.length());
结果Sport中转换到的字符串内容是"COM28";
当我不使用int flag这个的话接收返回值时,
mbtowc(sPort, aStr.c_str(), aStr.length());
结果Sport中转换到的字符串内容就成乱码了,而不是我想要的"\\\\.\\COM28";
请问这是什么原因呢?怎么样我可以办到修改sPort的内容为"\\\\.\\COM28" ???
谢谢!!
第二个问题:
wchar_t sPort[100];
wcscpy(sPort, L"\\\\.\\COM28");
这样暂且造了一个sPort数据内容为:"\\.\COM28";按老版本VCL,这样可以使用CreateFile函数正确打开串口号大于10后无法打开的问题了。
但是神奇的是,当我调用CreateFile函数时,却打开不成功。这又是为什么呢?
6 个解决方案
#1
定义了数组以后,要初始化一下,如:
wchar_t sPort[32];
memset(sPort, 0x0, sizeof(sPort));
wchar_t sPort[32];
memset(sPort, 0x0, sizeof(sPort));
#2
char字符串和wchar_t字符串互相转换用WindowsAPI好像好一些, MultiByteToWideChar和WideCharToMultiByte这两个函数的用法一搜索就有了。
#3
但是操作总是错的,返回值不正确,不知道是什么情况。
上面的代码里有一处错误,使用函数错了,
应该使用
mbstowcs(wchar_t *dst, const char * src, size_t len);
但是我把
char src[] = "\\\\.\\COM20";
wchar_t dst[100];
mbstowcs(dst, src, sizeof(src));
结果只转换了一个字符。其它统统未转换,这是什么情况?
上面的代码里有一处错误,使用函数错了,
应该使用
mbstowcs(wchar_t *dst, const char * src, size_t len);
但是我把
char src[] = "\\\\.\\COM20";
wchar_t dst[100];
mbstowcs(dst, src, sizeof(src));
结果只转换了一个字符。其它统统未转换,这是什么情况?
#4
没招,使用那个函数到底也不知道哪里出错了。
现在我改用其它方式来处理这个问题了,头疼。
UnicodeString UStr;
UStr = “\\\\.\\” + ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];
UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。
现在我改用其它方式来处理这个问题了,头疼。
UnicodeString UStr;
UStr = “\\\\.\\” + ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];
UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。
#5
你也是使用MultiByteToWideChar函数,解决不了吗
#6
无效,我已经放弃它了。现在使用XE10后,转换起来越来越麻烦了 ,不过就那样凑合用吧。UnString,AnsiString,服了。
#1
定义了数组以后,要初始化一下,如:
wchar_t sPort[32];
memset(sPort, 0x0, sizeof(sPort));
wchar_t sPort[32];
memset(sPort, 0x0, sizeof(sPort));
#2
char字符串和wchar_t字符串互相转换用WindowsAPI好像好一些, MultiByteToWideChar和WideCharToMultiByte这两个函数的用法一搜索就有了。
#3
但是操作总是错的,返回值不正确,不知道是什么情况。
上面的代码里有一处错误,使用函数错了,
应该使用
mbstowcs(wchar_t *dst, const char * src, size_t len);
但是我把
char src[] = "\\\\.\\COM20";
wchar_t dst[100];
mbstowcs(dst, src, sizeof(src));
结果只转换了一个字符。其它统统未转换,这是什么情况?
上面的代码里有一处错误,使用函数错了,
应该使用
mbstowcs(wchar_t *dst, const char * src, size_t len);
但是我把
char src[] = "\\\\.\\COM20";
wchar_t dst[100];
mbstowcs(dst, src, sizeof(src));
结果只转换了一个字符。其它统统未转换,这是什么情况?
#4
没招,使用那个函数到底也不知道哪里出错了。
现在我改用其它方式来处理这个问题了,头疼。
UnicodeString UStr;
UStr = “\\\\.\\” + ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];
UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。
现在我改用其它方式来处理这个问题了,头疼。
UnicodeString UStr;
UStr = “\\\\.\\” + ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];
UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。
#5
没招,使用那个函数到底也不知道哪里出错了。
现在我改用其它方式来处理这个问题了,头疼。
UnicodeString UStr;
UStr = “\\\\.\\” + ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];
UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。
你也是使用MultiByteToWideChar函数,解决不了吗
#6
没招,使用那个函数到底也不知道哪里出错了。
现在我改用其它方式来处理这个问题了,头疼。
UnicodeString UStr;
UStr = “\\\\.\\” + ComDevComBox->Items->Strings[ComDevComBox->ItemIndex];
UStr.c_str()返回的是 const wchar_t *的,这样凑合用吧。正好我是用来打开串口用的。需要连接两个字符串,这样挺合适。并且通过这样的方式成功打开了COM口大于10的串口。
你也是使用MultiByteToWideChar函数,解决不了吗
无效,我已经放弃它了。现在使用XE10后,转换起来越来越麻烦了 ,不过就那样凑合用吧。UnString,AnsiString,服了。