У меня есть программа MFC, которая использует GetTempFileName
, В Windows 7 он работает правильно, однако, когда я беру тот же код в Windows 10, он производит мусор.
TCHAR temp_dir[1024];
GetTempPath(1024,temp_dir);
TCHAR temp_file[1024];
GetTempFileName("C:\\","udb",0,temp_file);
std::cout << "Temp DB Path: " << temp_file << std::endl;
В Windows7:
Temp DB Path: C:\udb2145.tmp
В Windows10:
Temp DB Path: o▒
Я делаю что-то не так в своем коде? Или я должен использовать другую функцию?
Ну, во-первых, когда я тестировал ваш пример, GetTempFileName возвращает 0, что означает, что он обнаружил ошибку (возвращаемое значение для успеха — ненулевой идентификатор временного файла). GetLastError возвращает -5, что означает: «Доступ запрещен», и я очень сомневаюсь, что неадминистративные приложения могут писать в «C: \» (по крайней мере, в Windows 8+).
Значения мусора, которые вы видите и которые печатаются, связаны с тем, что вы не инициализировали свой массив temp_file. Вы должны сделать это так:
TCHAR temp_file[1024] = {0};
И, чтобы ваш код работал, сохраните временный файл в фактической временной папке:
GetTempFileName(temp_dir,"udb",0,temp_file);
РЕДАКТИРОВАТЬ: И, как уже отмечал один из комментаторов, если ваш код использует Unicode, вам потребуется wcout для правильного вывода имени файла. В противном случае вы увидите только первый символ пути к файлу. Но это повлияет на вывод на консоль.
Других решений пока нет …