Вопрос о действительном пути файла
-
10-10-2019 - |
Вопрос
Я использую следующий код для создания файла, но он всегда не удался с кодом ошибки 123 (синтаксис пути недопустим).
Странно: path_ok всегда в порядке, но path_err Всегда не сработал с 123. и после сбоя, буфер, который path_err указывает на очистку.
Может ли кто -нибудь пролить на меня свет? Я проверил память двух указателей, и их содержание кажется идентичным.
Большое спасибо.
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 );
Функция confosedumpfilename () такая же:
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;
}
Обновлять
В моем вышеуказанном коде, когда я выполняю следующий код:
WCHAR *pDumpFileName = ComposeDumpFileName();
После возвращения Compedumpfilename его кадр стека недействителен, однако его локальная переменная WCHAR DIMP_FILE_PATH [MAX_PATH все еще существует в стеке. Так что это объясняет, почему я все еще могу видеть его содержание, хотя пространство стека для него уже недействительно.
Затем я выполняю следующее оператор:
::wprintf(pDumpFileName);
HANDLE hFile = ::CreateFileW( pDumpFileName, GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
Wprintf () и Createfilew () имеют свои собственные кадры стека. Хотя в отладчике я обнаружил, что кадр стека wprintf () не разрушил контент памяти, указанный pdumpfilename, Createfilew могла бы иметь, поэтому он жалуется на неверный синтаксис пути.
Это мое нынешнее понимание, пожалуйста, поправьте меня, если я ошибаюсь.
Спасибо.
Решение
Один серьезная проблема С вашим кодом является буфер, который вы возвращаетесь, находится в стеке, и это большой нет: нет:
// build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
WCHAR dump_file_path[MAX_PATH];
Либо измените его, чтобы быть статичным:
// build the filename: APPNAME_COMPUTERNAME_DATE_TIME.DMP
static WCHAR dump_file_path[MAX_PATH];
или передать буфер в функцию.