"const char *" 類型的實參與 "LPCTSTR" 類型的形參不兼容
http://blog.sina.com.cn/s/blog_6ccd0a110100x5y7.htm
LPCTSTR是一個windows API數據類型。與其相關還有兩個類型:LPCSTR和LPCWSTRLPCSTR:根據windows API數據類型的命名規律,LP表示該變量是一個指針,C表示是常量(const),STR表示的是字符串。因此LPCSTR是一個const char*類型。這是一個windows(ANSI)字符串常量,注意是多字節編碼的。LPCWSTR:而W表示的是寬字符,因此LPCWSTR表示的也是字符串常量,不過是Unicode編碼的。
在WinNT.h中的定義:typedef const char* LPCSTR;typedef const wchar* LPCWSTR;
最後再看LPCTSTR:根據環境配置,如果定義了UNICODE宏,則是LPCWSTR類型,否則是LPCSTR類型。
MessageBox(NULL, "Open image failed!", "error", MB_OK);
首先來看MessageBox這個函數,它與LPCTSTR類似,當工程採取不同編碼方式的時候,對應的實際函數不同。當採取Unicode編碼時,實際調用的是MessageBoxW,該函數接受的參數是LPCWSTR;當採取的是多字節編碼時,實際調用的是MessageBoxA,該函數接受的參數是LPCSTR。
通常我們手動輸入的字符串都是const char*(即LPCSTR)類型的,因此只需將該句中的MessageBox改爲MessageBoxA即可。
另一種解決方法是對第二個和第三個參數使用“_T”宏:MessageBox(NULL,_T("Open image failed!"),_T("error"),MB_OK);或是:MessageBox(NULL, L"Openimage failed!", L"error",MB_OK);
關於該宏的具體含義和用法見:http://baike.baidu.com/view/2624257.htm該宏以來與工程的編碼環境。當工程是Unicode編碼時,_T將括號內的字符串以Unicode方式保存;當工程是多字節編碼時,_T將括號內的字符串以ANSI方式保存,這種情況相當於不起作用。
而另一種類似的關鍵字“L”,則是不管編碼環境是什麼,都是將其後面的字符串以Unicode方式保存。
注:關於環境的配置,可以在“工程屬性”->“常規”->“字符集”中,選擇“使用Unicode字符集”或是“使用多字節編碼字符集”(即ANSI編碼)。