从文件保存对话框返回文件名(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尾部保留空间。虽然在这个特定的地方可能不需要,但预留多一个字符有时可以节省你几个小时的内存损坏跟踪。