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

TCHAR理論上也是對的,但初始化之后,接下去不知道該怎么用了:

TCHAR* szLogin = new TCHAR[MAX_LENGTH]; memset(szLogin, 0, MAX_LENGTH); 

如果只是轉換常量的會超級簡單,就不需要經過QString的手了:

LPCWSTR str = TEXT("Hello"); 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM