Frage

Ich bin mit dem folgenden Code eine Datei zu erstellen, aber es ist immer mit dem Fehlercode 123 fehlgeschlagen (die Pfadsyntax ist nicht gültig).

Das Merkwürdige ist: path_ok ist immer in Ordnung, aber path_err immer gescheitert mit 123 Und nach dem Scheitern der Puffer, dass path_err Punkte gelöscht.

Kann jemand etwas Licht auf mich vergießen? Ich habe die Erinnerung an den zwei Zeiger überprüft, und ihr Inhalt scheint identisch zu sein.

Vielen Dank.

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

Die ComposeDumpFileName () Funktion ist wie folgt:

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

Update

In meinem obigen Code, wenn ich den folgenden Code ausführen:

WCHAR *pDumpFileName = ComposeDumpFileName();

Nach dem ComposeDumpFileName zurückgekehrt, dessen Stapelrahmen ist ungültig, aber seine lokale Variable WCHAR dump_file_path [MAX_PATH] existiert nach wie vor auf dem Stapel. So dies erklärt, warum ich immer noch ihren Inhalt für sie, obwohl die Stapelspeicher bereits ungültig sehen ist.

Dann führe ich die folgende Anweisung:

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

Die wprintf () und CreateFileW () hat ihr eigenes Stack-Frames. Obwohl in dem Debugger, fand ich, dass wprintf () 's Stack-Frame nicht der Speicherinhalt zerstören zeigte durch die pDumpFileName , konnten die CreateFileW haben, so ist es beschwert sich über eine ungültige Pfadsyntax.

Das ist mein gegenwärtiges Verständnis, bitte korrigieren Sie mich, wenn ich falsch bin.

Danke.

War es hilfreich?

Lösung

One major problem with your code is the buffer you are returning is on the stack and this is a big no no:

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

Either change it to be a static:

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

or pass the buffer into the function.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top