2014-02-05 2 views
1

При попытке отобразить диалог win32 с помощью функции MessageBox текст, похоже, отключается, но, как ни странно, это происходит только при создании для выпуска, что оставляет меня полностью озадаченным.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)' в качестве альтернативы. –

Смежные вопросы