Domanda

Sto usando il seguente codice per creare un file, ma è sempre riuscito con il codice di errore 123 (la sintassi del percorso non è valido).

La cosa strana è: path_ok è sempre ok, ma path_err sempre fallito con 123. E dopo il fallimento, il buffer che path_err punti per vengono cancellati.

Qualcuno potrebbe far luce su di me? Ho controllato la memoria dei 2 puntatori, e il loro contenuto sembra essere identici.

Molte grazie.

 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 funzione ComposeDumpFileName () è simile a questo:

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

Aggiorna

Nel mio codice di cui sopra, quando eseguo il seguente codice:

WCHAR *pDumpFileName = ComposeDumpFileName();

Dopo la ComposeDumpFileName restituito, il suo stack frame è valido, tuttavia, la sua variabile locale WCHAR dump_file_path [MAX_PATH] esiste ancora in pila. Quindi questo spiega perché posso ancora vedere il suo contenuto anche se lo spazio di stack perché è già valido.

Poi ho eseguire la seguente dichiarazione:

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

Il wprintf () e CreateFileW () ha i propri stack frame. Anche se nel debugger, ho scoperto che wprintf () stack frame 's non ha distrutto il contenuto della memoria puntato dal pDumpFileName , i CreateFileW potrebbero avere, in modo che si lamenta una sintassi percorso non valido.

Questa è la mia attuale comprensione, per favore correggetemi se sbaglio.

Grazie.

È stato utile?

Soluzione

Un grave problema con il codice è il buffer si restituisce è in pila e questo è un grande no no:

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

In entrambi i cambiarlo essere una statica:

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

o passare il buffer nella funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top