Question

Je suis en utilisant le code suivant pour créer un fichier, mais il a toujours échoué avec le code d'erreur 123 (la syntaxe de chemin n'est pas valide).

La chose étrange est: path_ok est toujours ok, mais path_err toujours échoué avec 123. Et après l'échec, le tampon path_err points est effacé.

Quelqu'un pourrait-il faire la lumière sur moi? J'ai vérifié la mémoire des 2 pointeurs, et leur contenu semble être identique.

Merci.

 WCHAR *pDumpFileName = ComposeDumpFileName();
 WCHAR *path_ok = _T("d:\\myapp_Utopia_2010-11-15_04-22-05.dmp");
 WCHAR *path_err = pDumpFileName;
 ::wprintf(pDumpFileName);
 HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE, 
  0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

La fonction ComposeDumpFileName () est comme suit:

WCHAR* ComposeDumpFileName(void)
{
 // get the time
    SYSTEMTIME sys_time;
    ::GetSystemTime(&sys_time);

    // get the computer name
    WCHAR computer_name[MAX_COMPUTERNAME_LENGTH + 1];
    DWORD computer_name_len = ARRAYSIZE(computer_name);
 ::GetComputerNameW(computer_name, &computer_name_len);

    // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
    WCHAR dump_file_path[MAX_PATH];

 ::swprintf_s(dump_file_path, ARRAYSIZE(dump_file_path), 
        _T("d:\\myapp_%s_%04u-%02u-%02u_%02u-%02u-%02u.dmp"), 
        computer_name, sys_time.wYear, sys_time.wMonth, sys_time.wDay,
        sys_time.wHour, sys_time.wMinute, sys_time.wSecond);

 return dump_file_path;
}

Mise à jour

Dans mon code ci-dessus, quand j'exécute le code suivant:

WCHAR *pDumpFileName = ComposeDumpFileName();

Après la ComposeDumpFileName retourné, son cadre de pile est invalide, cependant, sa variable locale WCHAR dump_file_path [MAX_PATH] existe toujours sur la pile. Donc, ce qui explique pourquoi je peux encore voir son contenu si l'espace de pile car il est déjà invalide.

J'exécutez l'instruction suivante:

     ::wprintf(pDumpFileName);
     HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE, 
      0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

Le wprintf () et CreateFileW () a ses propres cadres de pile. Bien que dans le débogueur, je trouve que wprintf () du cadre de pile n'a pas détruit le contenu de la mémoire pointée par le pDumpFileName , les CreateFileW pourrait avoir, il se plaint une syntaxe de chemin non valide.

Ceci est ma compréhension actuelle, s'il vous plaît me corriger si je me trompe.

Merci.

Était-ce utile?

La solution

Un problème majeur avec votre code est le tampon que vous retournerez est sur la pile, ce qui est un grand pas de no:

 // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP 
 WCHAR dump_file_path[MAX_PATH]; 

Soit changer pour être statique:

 // build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP 
 static WCHAR dump_file_path[MAX_PATH]; 

ou passer le tampon dans la fonction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top