2017-07-19 63 views
1

我繼承了一個我無法構建的C++ visual studio項目。問題是像「CreateEvent」這樣的很多api調用都會向它們提供char *輸入,但錯誤代碼需要「LPCWSTR」。這幾乎是數百行代碼,或多或少有類似的投訴。visual studio C++ UNICODE相關故障排除循環

尋找幫助,常見的解決方案似乎是我應該禁用Unicode字符集。但是,當我這樣做時,出現「爲非Unicode字符集構建MFC項目已被棄用」錯誤。尋找幫助,常見的解決方案似乎是我應該啓用Unicode字符集。

因此,如果我這樣做,我就會受到衝擊,如果我不這樣做,我會受到衝擊。什麼是正確的舉動?

+0

可能你覺得這有用:https://stackoverflow.com/questions/19715144/how-to-convert-char-to-lpcwstr –

+0

你應該更新你的整個代碼庫以正確使用寬字符。其實這應該在15年前完成。 – VTT

+0

「char *」在UTF-8上仍然是標準。大多數軟件工程師討厭「wchar_t *」併爲每個字符串表達式添加L.看起來像微軟是唯一一個強迫程序員使用UNICODE的人。微軟希望終止MBCS,但我認爲這不會很快發生。 – JazzSoft

回答

2

CreateEvent本身不過是一個宏觀#define「d是的這是在WinAPI的的synchapi.h

#ifdef UNICODE 
#define CreateEvent CreateEventW 
#else 
#define CreateEvent CreateEventA 
#endif // !UNICODE 

通常(至少在所有的Windows項目,我曾經工作)這實際上宣告了兩個函數之一UNICODE宏被定義,因此實際上可以與CreateEventW函數一起使用,該函數接受LPCWSTR(換句話說const wchar_t*)字的參數,它應該是一個UTF-16字符串文字。 如果它沒有在你的項目中定義,那麼它使用CreateEventA,它接受LPCSTR參數(實際上相當於const char*),並將其視爲ASCII字符串。

您的項目似乎已設置爲僅支持ASCII字符串。還有......好吧,現在這已經被棄用了:)以前有一些特殊的附加組件支持這種情況的構建,叫做MFC MBCS DLL Add-on。但是,我不是100%確定它仍然可用,這裏是a question here at StackOverflow about that

如果您沒有找到這樣的插件或任何其他解決方案,那麼恐怕唯一的方法就是將它編譯爲Unicode字符串。實際上,即使您找到了解決方法,如果您要繼續維護此項目,我建議您將此活動添加到您的待辦事項中,因爲此類解決方法可能隨時停止存在。

無論如何,瞭解您的最終結果將會很有趣。

+0

我使用的是Visual Studio 2017,不需要安裝MBCS插件,雖然它需要這意味着微軟在這一點上意識到了MBCS的支持。 – JazzSoft

0

看來您正在使用Microsoft Visual Studio 2013.此版本分發時沒有MFC的MBCS版本。另一方面,Visual Studio 2015和2017與MFC的MBCS版本一起提供。

如果你想建立MBCS你的項目,你需要下載和安裝這個:

https://www.microsoft.com/en-us/download/details.aspx?id=40770

另一種選擇是你的整個項目轉換爲Unicode,但是這可能是很多工作取決於你的項目。

+0

我有VS2015完全相同的問題 – n4rzul