c - Spørgsmål om en gyldig filsti

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger følgende kode til at oprette en fil, men det mislykkedes altid med fejlkode 123 (stemmesyntaxen er ikke gyldig).


Den underlige ting er: path\_ok er altid ok, men path\_err mislykkedes altid med 123. Og efter fejlen peger bufferen path\_err på ryddet.


Kan nogen kaste lys over mig? Jeg har kontrolleret hukommelsen af ​​de 2 pointers, og deres indhold synes at være identisk.


Mange tak.


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


Funktionen ComposeDumpFileName () er som denne:


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


Opdater



I min kode ovenfor, når jeg udfører følgende kode:


WCHAR *pDumpFileName = ComposeDumpFileName();


Efter at ComposeDumpFileName er returneret, er stakrammen ugyldig, men dens lokale variabel WCHAR dump\_file\_path [[MAX\_PATH]] eksisterer stadig på stakken. Så det forklarer derfor, at jeg stadig kan se indholdet, selvom stakken er, fordi den allerede er ugyldig.


Så udfører jeg følgende erklæring:


     ::wprintf(pDumpFileName);
     HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC\_READ | GENERIC\_WRITE, 
      0, NULL, CREATE\_ALWAYS, FILE\_ATTRIBUTE\_NORMAL, NULL ); 


Wprintf () og CreateFileW () har deres egne stakrammer. Selvom i debuggeren fandt jeg, at wprintf () s stack ramme ikke ødelagde hukommelsesindholdet peget af pDumpFileName , som CreateFileW kunne have, så det klager over en ugyldig sti syntaks.


Dette er min nuværende forståelse, vær venlig at rette mig, hvis jeg tager fejl.


Tak.

Bedste reference


Et stort problem med din kode er den buffer du vender tilbage på stakken, og dette er et stort nej nej:


 // build the filename: APPNAME\_COMPUTERNAME\_DATE\_TIME.DMP 
 WCHAR dump\_file\_path[MAX\_PATH]; 


Enten ændre det til at være en statisk


 // build the filename: APPNAME\_COMPUTERNAME\_DATE\_TIME.DMP 
 static WCHAR dump\_file\_path[MAX\_PATH]; 


eller send bufferen til funktionen.