我有一个简单的保存文件对话框,我希望将其用作返回文件路径,名称和扩展名的工具。此函数产生运行时错误,表示文件名周围的堆栈已损坏。我希望像这样使用它:
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);
}
答案 0 :(得分:9)
wchar_t filename[] = L"";
这是一个包含一个元素的数组。您正在将更大的字符串复制到其中,这会破坏堆栈帧。修正:
wchar_t filename[MAX_PATH] = {0};
答案 1 :(得分:1)
我感觉你通过wcscpy破坏了内存 - 你已经分配了空的“filename”并将非空值(来自saveFileName)复制到它,从而破坏了内存。
通过分配MAXPATH + 1个元素而不是MAXPATH来保留尾随\ 0的空间是一个好主意。虽然在这个特定的地方可能不需要,但是保留一个字符有时可以节省数小时的内存损坏错误跟踪。
答案 2 :(得分:0)
尝试
wchar_t filename[MAX_PATH]