2011-01-09 7 views
0

파일 경로, 이름 및 확장명을 반환하는 도구로 사용하려는 간단한 파일 저장 대화 상자가 있습니다. 이 함수는 파일 이름 주위의 스택이 손상되었다는 런타임 오류를 발생시킵니다. 나는 그것을 이렇게 사용하고 싶다.파일 저장 대화 상자 (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); 
} 

답변

9
wchar_t filename[] = L""; 

. 스택 프레임을 손상시키는 더 큰 문자열을 복사하고 있습니다. 수정 :

wchar_t filename[MAX_PATH] = {0}; 
0

난 당신이 wcscpy를 통해 메모리가 손상 느낌이

wchar_t filename[MAX_PATH] 
1

시도 - 당신이 "파일 이름"빈 할당 한을하고 여기에 (saveFileName에서) 비어 있지 않은 값을 복사, 따라서 메모리가 손상됩니다.

또한 MAXPATH가 아닌 MAXPATH + 1 요소를 할당하여 \ 0을 추적 할 공간을 예약하는 것이 좋습니다. 이 특정 장소에서는 필요하지 않을 수도 있지만, 한 개 더 많은 문자를 예약하면 때때로 메모리 손상 버그 추적 시간을 절약 할 수 있습니다.