2013-07-30 4 views
2

У меня есть 32-битное оконное приложение (с источником C/Win32), которое создает файл данных в той же папке, где находится исполняемый файл.Как получить (программно) расположение виртуального файла Windows UAC?

Поскольку приложение не имеет программы установки, и пользователь может разместить исполняемый файл там, где он хочет, приложение имеет диалоговое окно для информирования пользователя, где находятся его данные.

Но в Microsoft Vista/Seven, если пользователь помещает приложение в файлы программы или в любую другую папку, защищенную системой, файл данных становится виртуализированным и перемещается в виртуальный магазин.

Если под Vista/Seven, я все еще хочу, чтобы сообщить пользователю, где файл данных находится: (без предупреждения виртуализации в файле манифеста)

  1. Как я могу знать (программно), если файл данных виртуализирован? Или если папка, в которой находится исполняемый файл, подразумевает, что файл данных будет виртуализирован?

  2. Предполагая, что файл данных виртуализирован, как я могу узнать (программно) местоположение виртуальной папки, чтобы показать его в информационном диалоговом окне?

Я нашел следующий вопрос очень близко к тому, что я спрашиваю, но он не показывает решение (если таковые имеются) знать, когда виртуализация происходит для файла, и где он получает виртуализировать.

How to detect file redirection to the Windows VirtualStore?

ответ

3

Виртуализация является прозрачным для приложений. Единственный способ узнать, виртуализирован ли он, - спросить ОС, за ответ в вопросе, с которым вы связались (используйте GetTokenInformation() с флагом TokenVirtualizationEnabled), но нет способа (я знаю) о том, чтобы спросить ОС, где виртуализированные элементы фактически хранятся, поскольку они могут отличаться от одной версии ОС к другой. Вам нужно будет провести некоторое исследование, а затем жестко запрограммировать пути для каждой данной ОС, которые ваше приложение обнаруживает во время выполнения.

Если вы собираетесь обновить свой код для обнаружения виртуализации, вам лучше обновить код, чтобы лучше играть с UAC. Прекратите хранить ваши файлы там, где они не принадлежат, и начните хранить их там, где Microsoft хочет, чтобы вы их хранили. В этом случае вместо этого в профиле пользователя. Используйте SHGetFolderPath() или соответствующую функцию, чтобы найти папку пользователя CSIDL_LOCAL_APPDATA (или SHGetKnownFolderPath() на Vista +, чтобы найти папку FOLDERID_LocalAppData), а затем создайте подпапку под ней для вашего приложения, чтобы хранить свои файлы данных.