Converti char in LPCWSTR

Qualcuno può aiutarmi a correggere questo codice:

char szBuff[64]; sprintf(szBuff, "%p", m_hWnd); MessageBox(NULL, szBuff, L"Test print handler", MB_OK); 

L’errore è, non può convertire il 2 ° parametro in LPCWSTR.

Per questo caso specifico , la correzione è abbastanza semplice:

 wchar_t szBuff[64]; swprintf(szBuff, L"%p", m_hWnd); MessageBox(NULL, szBuff, L"Test print handler", MB_OK); 

Cioè, usa le stringhe Unicode in tutto. In generale, quando si programma su Windows, usare wchar_t e UTF-16 è probabilmente il più semplice. Dipende da quanta interazione con altri sistemi devi fare, ovviamente.

Per il caso generale, se hai una stringa ASCII (o char * ), usa WideCharToMultiByte per il caso generale, o mbstowcs come @Matthew indica per casi più semplici ( mbstowcs funziona se la stringa è nella locale C corrente) .

Si potrebbe voler esaminare mbstowcs , che convertirà una stringa convenzionale “un byte per carattere” in una stringa “più byte per carattere”.

In alternativa, modifica le impostazioni del progetto per utilizzare le stringhe Multibyte: per impostazione predefinita sono solitamente stringhe “Unicode” o “Wide Character” (non riesco a ricordare il nome esatto dell’opzione in cima alla mia testa).

Se stai compilando con UNICODE , crea tutte le stringhe con cui lavori con doppia larghezza, quindi definiscile come wchar_t* .

Se davvero devi convertire ASCII in Unicode, usa le macro di conversione ATL .

Dal momento che il tuo tag suggerisce VC ++, sto suggerendo CString. Se sì, lo snippet seguente funzionerà anche per il tuo caso:

 CString szBuff; szBuff.Format(_T("%p"), m_hWnd); MessageBox(NULL, szBuff, L"Test print handler", MB_OK); 

L’utilizzo di MultiByteToWideChar () funziona per me:

 void main(int argc, char* argv[]) { ... wchar_t filename[4096] = {0}; MultiByteToWideChar(0, 0, argv[1], strlen(argv[1]), filename, strlen(argv[1])); // RenderFile() requires LPCWSTR (or wchar_t*, respectively) hr = pGraph->RenderFile(filename, NULL); ... }