2014-02-05 109 views
1

當試圖使用MessageBox函數顯示一個win32對話框時,文本似乎被切斷,但奇怪的是,這隻發生在構建釋放時,這讓我完全感到困惑。Win32 MessageBox截斷文本

代碼這一現象的:

wchar_t filepath[ MAX_PATH ]; 
GetModuleFileName(NULL, filepath, MAX_PATH); 

wchar_t* fnp = PathFindFileName(filepath); 

wchar_t filename[MAX_PATH]; 
swprintf(filename, MAX_PATH, L"%ls", fnp); 
printf("%ls", filename); 
wchar_t* pwc; 
pwc = wcsstr(filename,L".exe"); 
wcsncpy(pwc,L"_real.exe\0",10); 

if(!file_exists(filename)){ 
    wchar_t buff[] = L"unable to start because %ls cannot be found."; 
    wchar_t say[MAX_PATH+sizeof(buff)-3]; 
    swprintf(say, wcslen(say), buff, filename); 
    MessageBoxW(NULL, say, L"Error", MB_OK | MB_ICONERROR); 
    return 0; 
} 

回答

0

主要的問題是你寫wcslen(say)。在你編寫它的地方,say尚未初始化,所以wcslen(say)調用UB。你的意思是寫sizeof(say)/sizeof(wchar_t)

最重要的是,sizeof(buff)char單位的大小。但陣列有wchar_t單位。所以這段代碼是錯誤的。

你想是這樣的:

wchar_t buff[] = L"unable to start because %ls cannot be found."; 
wchar_t say[MAX_PATH + sizeof(buff)/sizeof(wchar_t) - 3]; 
swprintf(say, sizeof(say)/sizeof(wchar_t), buff, filename); 
+0

這似乎已經解決了這一問題,但出於純粹的好奇心,你不會碰巧知道爲什麼它工作在調試環境中,你會嗎? –

+0

這是未定義的行爲會發生什麼。任何事情都可能發生,甚至程序工作。 –

+1

如果你不關心可移植性,你可以使用'_countof(say)'作爲替代。 –