stlcours |
2015-02-18 19:15 |
QString转换成LPCWSTR
不知道大家用QT做什么程序,但应该还是Windows程序居多吧,仍免不了与WINAPI打交道。这就要求数据类型要与Windows一致,而QT的数据类型却是自成一体的。这就需要转换。比如我用到了LogonUser函数,其原型是: BOOL LogonUser(_In_ LPTSTR lpszUsername,_In_opt_ LPTSTR lpszDomain,_In_opt_ LPTSTR lpszPassword,_In_ DWORD dwLogonType,_In_ DWORD dwLogonProvider,_Out_ PHANDLE phToken); 因为实际使用LogonUserW函数,所以要求LPCWSTR类型(前三个参数)。一开始我没当回事,这样写: char* szLogin = new char[MAX_LENGTH]; memset(szLogin, 0, MAX_LENGTH);
QByteArray ba111 = strUser.toLocal8Bit(); // strUser是QString,外部传来的数据。 char* temp111 = ba111.data(); strcpy(szLogin, temp111); 然后强行转换char*到LPCWSTR:
HANDLE hh; if (!LogonUser((LPCWSTR)szLogin, (LPCWSTR)szDomaine, (LPCWSTR)szPass, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hh)) 编译不报错,但是执行错误。我猜测是不是toLocal8Bit()函数使用错误,毕竟LPCWSTR要求的是宽字符,强行转换之后,这个char*内部仍是使用一个字节表示一个字母,我做强行转换,只是把编译器骗过去而已,编译器并没有帮我做任何事情。后来灵机一动,既然QT是内置Unicode编码的,那么QChar应该是16位的宽字符,于是查了QString函数以后,这样写: const QChar* szLogin = strUser.unicode(); 此时再转换就没有问题了: if (!LogonUser((LPCWSTR)szLogin, (LPCWSTR)szDomaine, (LPCWSTR)szPass, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hh)) ------------------------------------------------------------------------------ 另外这几个函数可能也有帮助,但目前不清楚怎么用:
std::string toStdString () const std::wstring toStdWString () const const ushort * utf16 () const
|
|