2009-03-20 2 views
6

che sto cercando di creare un (molto) semplice programma Win32 GUI, ma per qualche motivo il compilatore (sto usando VC++ 2008 Express) vuole che io typecast manualmente ogni stringa o char * a LPCWSTR:Trasmissione a LPCWSTR?

I ottenere questo errore del compilatore ogni volta che lo faccio, ad esempio ottengo questo errore per "Hello" e "Note":

errore C2664: 'MessageBoxW': impossibile convertire il parametro 2 da 'const char [22]' a 'LPCWSTR'

Ti prego, dimmi che non ho per lanciare ogni volta che faccio questo ....

Ecco il codice:

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, "Hello", "Note", MB_OK); 
    return 0; 
} 
+1

o, semplicemente invocare MessageBoxA (NULL, "Hello", "Note", MB_OK); – deemok

risposta

14

L'impostazione predefinita per i nuovi progetti in VS2008 è la creazione di applicazioni compatibili con UNICODE. È possibile cambiare questa impostazione predefinita e tornare ad usare ANSI o MBCS applicazioni (Proprietà-> Configurazione Properties-> Generale-> Character Set), o utilizzare Unicode stringhe in questo modo:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, L"Hello", L"Note", MB_OK); 
    return 0; 
} 

fare non lanciare la vostra stringhe a LPCWSTR perché ciò porterà a comportamenti non definiti! Un char non è lo stesso di un wchar_t!

1

Il problema è che si sta creando per UNICODE e si stanno passando stringhe non Unicode.

Prova:

MessageBox(NULL, L"Hello", L"Note", MB_OK); 

o impostare la generazione per ANSI/MBCS o considerare di usare TCHARs (che sono un dolore).

1

I miei ricordi di programmazione Win32 C sono confusa, ma mi sembra di ricordare, è necessario avviare avvolgendo le vostre stringhe in questa macro:

_T ("mystring")

Quando si crea unicode, questo sarà convertito in una stringa unicode.

Se si genera unicode o se si è sicuri di gestire una particolare stringa in unicode, è possibile utilizzare il contrassegno L "", che è ciò che fa la macro _T sotto le copertine.

Potrebbe essere necessario includere l'intestazione tchar.h.

Quando si esegue la programmazione Win32, in genere dichiaro le stringhe come TCHAR * szWhatever in modo che le cose funzionino su Win9x quasi come NT/Win2k/XP. (Ci sono anche altre macro di convenienza come LPTSTR e così via, e MFC contiene alcuni semplici macro di conversione per i casi in cui è effettivamente necessario convertire tra ansi e unicode per chiamare specifiche API).

0

Come altri post hanno detto, state costruendo un'applicazione Unicode. È possibile passare da e verso il progetto Unicode nelle impostazioni del progetto (non dimenticare di impostarlo per entrambe le configurazioni "Debug" e "Release".

Se si desidera utilizzarlo, dovrete anteporre tutte le corde statiche con L:

L"Some static string" 

Per char [] stringhe c'è un metodo mbstowcs_s, che viene utilizzato o meno così:

std::string str; // the string you want to convert 

WCHAR wstr[128]; 
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR); 
mbstowcs_s(&convertedChars, wstr, str.c_str(), _TRUNCATE); 

Ecco come l'ho usato in uno dei miei progetti. Per l'utilizzo esatto fare riferimento a MSDN.