возвращение имени файла из диалогового окна сохранения файла (windows32) - PullRequest
0 голосов
/ 09 января 2011

У меня есть простое диалоговое окно сохранения файла, которое я хочу использовать в качестве инструмента для возврата пути к файлу, имени и расширения.Эта функция выдает ошибку времени выполнения, говоря, что стек вокруг имени файла поврежден.Я хочу использовать это так:

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);
}

Ответы [ 3 ]

9 голосов
/ 09 января 2011
 wchar_t filename[] = L"";

Это массив с одним элементом. Вы копируете в нее гораздо большую строку, которая повреждает кадр стека. Исправлено:

 wchar_t filename[MAX_PATH] = {0};
1 голос
/ 09 января 2011

У меня такое ощущение, что вы испортили память через wcscpy - вы выделили пустое «имя файла» и скопировали в него непустое значение (из saveFileName), повредив таким образом память.

Также неплохо зарезервировать место для трейлинга \ 0, выделяя элементы MAXPATH + 1, а не MAXPATH. Хотя это может быть и не нужно в этом конкретном месте, резервирование еще одного символа иногда экономит часы отслеживания ошибок памяти.

0 голосов
/ 09 января 2011

Попробуйте

wchar_t filename[MAX_PATH]
...