从文件保存对话框返回文件名(windows32)
问题描述:
我有一个简单的保存文件对话框,我想用它作为工具返回文件路径,名称和扩展名。这个函数产生一个运行时错误,说文件名周围的堆栈已损坏。我希望像这样使用它:从文件保存对话框返回文件名(windows32)
wchar_t filename[] = L"";
newGradebookDialog(hwnd, filename);
这里是我的功能。它修改文件名,因为我期望它,但运行时堆栈错误是我没有得到。
void newGradebookDialog(HWND hwnd, wchar_t file[])
{
OPENFILENAME ofn;
wchar_t saveFileName[MAX_PATH] = L"";
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = L"Database File (*.db)\0*.db\0";
ofn.lpstrFile = saveFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = L"db";
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
ofn.lpstrTitle = L"Save New Database";
if(GetSaveFileName(&ofn))
wcscpy(file,saveFileName);
}
答
wchar_t filename[] = L"";
这是与一个元素的数组。你正在复制一个更大的字符串,这会破坏堆栈帧。修复:
wchar_t filename[MAX_PATH] = {0};
答
尝试
wchar_t filename[MAX_PATH]
答
我有你通过wcscpy破坏内存的感觉 - 你分配空“文件名”,并复制非空值(从saveFileName)给它,从而破坏记忆。
此外,最好通过分配MAXPATH + 1元素而不是MAXPATH为\ 0尾部保留空间。虽然在这个特定的地方可能不需要,但预留多一个字符有时可以节省你几个小时的内存损坏跟踪。