2011-01-09 6 views
0

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

И вот моя функция. Он изменяет имя файла, как я ожидаю, но ошибка стека во время выполнения - это то, чего я не получаю.

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

ответ

9
wchar_t filename[] = L""; 

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

wchar_t filename[MAX_PATH] = {0}; 
1

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

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

Смежные вопросы