当试图使用MessageBox函数显示Win32对话框时,文本似乎被截断了,但是奇怪的是,这种情况仅在构建发行版时才会发生,这使我完全困惑。
发生这种情况的代码:
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;
}
主要的问题是在哪里写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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句