Я пытаюсь установить определенный каталог для моего кода, который является проектом MFC. Код для диалога был написан (в Visual Studio C ++), и теперь я собираюсь использовать .exe-файл этого кода в разных ОС и заменить этот файл в том каталоге, который я хочу. Чтобы достичь этой цели, я использовал GetModuleFileName поэтому, следуя эти предложения Я включил этот кусок кода в функцию OnInitDialog () моего кода:
//function that gets the directory without the file name:
TCHAR szFilePath[_MAX_PATH];
TCHAR driveLetter[3];
TCHAR directory[MAX_PATH];
TCHAR FinalPath[MAX_PATH];
::GetModuleFileName(NULL, szFilePath, _MAX_PATH);//Retrieves the current directory for the current process.
// Add all the files and directories in the windows directory.
//VERIFY(0 < ::GetWindowsDirectory(lpszWinPath, MAX_PATH));
// Make the windows directory the current directory.
::GetCurrentDirectory(MAX_PATH, lpszOldPath);
//::SetCurrentDirectory(lpszWinPath);
::SetCurrentDirectory("C:\\Program Files");
Тем не менее, теперь я не получаю сообщения об ошибке, но я не знаю, почему я не вижу никакого вывода. В качестве примера я ожидаю, что файл .exe в указанной директории будет создан.
Приведенный выше код не создает никаких файлов, поэтому он не создает EXE-файл. Предполагая, что он пытался создать .\Foo.EXE
это будет эффективно создавать C:\Program Files\Foo.EXE
, Это не правильно по ряду причин. Для начала, не указывайте путь жестко, так как он отличается от системы к системе. Вызов SHGetKnownFolderPath(FOLDERID_ProgramFiles, ...)
чтобы получить этот путь.
Затем создайте там подкаталог. Не помещайте исполняемые файлы туда напрямую.
Наконец, и, возможно, самое главное, осознайте, что это задача установщика, работающего с повышенными правами. При нормальном использовании, Program Files
только для чтения. тогда обычные программы также не создают исполняемые файлы.