Pregunta

Estoy utilizando el siguiente código para crear un archivo, pero siempre ha fallado con el código de error 123 (la sintaxis de la ruta no es válido).

Lo extraño es: path_ok es siempre bien, pero path_err Siempre que ha fallado por 123. Y después del fallo, el búfer que path_err puntos a se borra.

¿Alguien podría arrojar alguna luz sobre mí? He comprobado la memoria de los 2 punteros, y su contenido parece ser idéntica.

Muchas gracias.

 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 función ComposeDumpFileName () es como sigue:

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

Actualizar

En mi código anterior, cuando ejecuto el código siguiente:

WCHAR *pDumpFileName = ComposeDumpFileName();

Después de la ComposeDumpFileName volvió, su marco de pila no es válida, sin embargo, su variable local WCHAR dump_file_path [MAX_PATH] todavía existe en la pila. Así que esto explica por qué todavía puedo ver su contenido, aunque el espacio de pila no es válida ya.

Luego ejecute la siguiente instrucción:

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

El wprintf () y CreateFileW () tiene sus propios marcos de pila. Aunque en el depurador, encontré que wprintf () marco de pila 's no destruyó el contenido de memoria apuntado por el pDumpFileName , los CreateFileW podría tener, por lo que se queja de una sintaxis de ruta no válida.

Este es mi entendimiento actual, por favor me corrija si estoy equivocado.

Gracias.

¿Fue útil?

Solución

Una principal problema con su código es el buffer está devolviendo está en la pila y esto es un gran no no:

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

O cambiarlo a ser una estática:

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

o pasar el tampón en la función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top