不知道大家用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
TCHAR理論上也是對的,但初始化之后,接下去不知道該怎么用了:
TCHAR* szLogin = new TCHAR[MAX_LENGTH]; memset(szLogin, 0, MAX_LENGTH);
如果只是轉換常量的會超級簡單,就不需要經過QString的手了:
LPCWSTR str = TEXT("Hello");