Question

J'ai simple dialogue Enregistrer de fichier que je souhaite utiliser comme un outil pour retourner le chemin du fichier, le nom et l'extension. Cette fonction produit une erreur d'exécution, en disant que la pile autour de nom de fichier est corrompu. Je voudrais l'utiliser comme ceci:

wchar_t filename[] = L"";
newGradebookDialog( hwnd, filename );

Et voici ma fonction. Il modifie le nom de fichier que je l'attends, mais l'erreur de la pile d'exécution est ce que je ne comprends pas.

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);
}
Était-ce utile?

La solution

 wchar_t filename[] = L"";

C'est un tableau avec un élément. Vous copiez une chaîne beaucoup plus en elle, qui corrompt le cadre de la pile. Correction:

 wchar_t filename[MAX_PATH] = {0};

Autres conseils

J'ai le sentiment que vous corrompre la mémoire via wcscpy - vous avez attribué vide « nom de fichier » et copier la valeur non vide (de saveFileName) à elle, ainsi corrompt la mémoire

.

En outre, il est une bonne idée de l'espace de réserve pour fin \ 0 en allouant MAXPATH + 1 éléments, et non MAXPATH. Bien que peut-être pas nécessaire dans ce lieu particulier, réservant un plus omble chevalier vous permet d'économiser parfois des heures de suivi des bogues de corruption de mémoire.

Essayez

wchar_t filename[MAX_PATH]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top