我一直在試圖找到任何信息,但谷歌完全失敗了我。下面的代碼不能編譯爲標準的unicode,並且我在MessageBoxW中得到了損壞的東西(它是MessageBoxW,我已經在ollydbg中反彙編並測試了exe),但是我的用戶名「路徑」從路徑到exe在消息中正確顯示)。問題是C編譯器,出於某種原因無法正確編譯我的字符串。我用相同的結果嘗試了L和TEXT()。Visual C++損壞的Unicode字符串
這是唯一的輸入源文件,編碼爲UTF-8,沒有BOM(記事本++)。
#define _UNICODE
#define UNICODE
#include <windows.h>
void main() {
wchar_t exe[254];
GetModuleFileName(NULL,(wchar_t *)&exe,254);
MessageBox(NULL,(wchar_t *)&exe,L"юзер",0);
ExitProcess(0);
}
構建命令(我試過建築在Visual Studio 2003和Visual C++ 6,但很久以前放棄了,輸入cmd.exe切換到手動編譯得到原始結果):
cl.exe /c /nologo test-unicode-ui.c link.exe /nologo /nodefaultlib /entry:main kernel32.lib user32.lib /OUT:test-unicode-ui.exe test-unicode-ui.obj
這絕對沒有用,我嘗試過的每一種方法都給我腐敗的源代碼靜態字符串,但它可以與內部處理(例如,你從winapi得到的東西是可信的,工作正常)。當然,我可以手工編寫幾個字符串,在運行時,幸運的是我沒有很多,但這聽起來不奇怪嗎?
顯而易見,我在這裏失蹤?
我建議你停止使用十年以上的編譯器。較新版本的Visual Studio編譯並運行該代碼很好。 – 2013-02-08 16:16:32
你應該真的澄清你的問題。首先你說代碼「無法編譯」。然後你告訴我們,當運行(所以它似乎編譯)它會給出錯誤的輸出。此外,你應該剝離你的代碼到相關部分 - 字符串文字 - 並擺脫誤導的exe/GetModuleFileName(並且不僅告訴我們註釋中的細節以回答問題)。 – 2013-02-08 16:27:37
@詹姆斯:我很抱歉,但編譯器過去如何與unicode配合使用?我正在下載新版本,但那很奇怪。 – einclude 2013-02-08 16:29:12