Приложение, которое не запущено с повышенными привилегиями, не должно иметь доступа к каталогам Program Files
и Program Files (x86)
.Это хорошо для безопасности.Кроме того, в большинстве случаев , когда разработчик говорит своей программе сохранить данные в папке Program Files
, например, настройки программы, он полностью забыл, что настройки программы должны быть индивидуальными для каждого пользователя!То есть каждый пользователь на локальном компьютере должен иметь возможность использовать программу, не влияя на других пользователей.Другими словами, приложение с хорошим поведением должно вместо этого сохранять свои настройки в каталоге
C:\Users\<User Name>\AppData\Local\<Manufacturer>\<Product>\<Product Version>
.
Например, мое программное обеспечение AlgoSim записывает в
C:\Users\<User Name>\AppData\Local\Rejbrand\AlgoSim\2.0
Конечно, путь
C:\Users\<User Name>\AppData\Local\
необходимо динамически искать во время выполнения.Для этого используйте
SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
.
Начиная с Windows Vista, приложения, которые не работают с повышенными привилегиями и пытаются выполнить запись в папку Program Files
(или Program Files (x86)
), будут вФакт записи в папку VirtualStore, по незнанию.Microsoft подумала, что это будет лучше, чем программный сбой (вызванный ограничением доступа).И действительно, благодаря этому большинство старых программ, которые сохраняют свои настройки в папке Program Files
, продолжат работать с Windows Vista +, и каждый пользователь получит свои собственные настройки в качестве бонуса, даже если оригинальный производитель программного обеспечения не думалоб этом.
Вы можете использовать манифест, чтобы сообщить Windows, что ваше приложение знает о VirtualStore и что Windows не должна изменять какие-либо пути во время выполнения.Но если вы действительно хотите иметь возможность записи в папку Program Files
, то я думаю, что вам нужно каждый раз запускать приложение с повышенными привилегиями, что в общем случае нецелесообразно.
Подробности о том, какчтобы создать манифесты, чтобы ваша программа отображала подсказку UAC при каждом выполнении, и как отключить VirtualStore, были рассмотрены в нескольких предыдущих вопросах переполнения стека.Не стесняйтесь использовать окно поиска!