Почему изменение% USERPROFILE% приводит к сбою sHGetFolderPath SIDL_APPDATA? - PullRequest
0 голосов
/ 25 ноября 2010

Я пытаюсь отладить проблему с Cabal, где она не будет работать, если я изменю значение переменной среды% USERPROFILE% до ее запуска.Кажется, я проследил ошибку до вызова win32 sHGetFolderPath, указывающего на SIDL_APPDATA, который, похоже, не работает, если эта переменная изменена.

Хотя я не совсем уверен, куда идти дальше.Почему этот звонок прерывается?Почему изменение этого env-var не просто указывает на каталог пользователя в другом месте?(Я пытаюсь заставить cabal работать корректно с флэш-накопителя.)

По той же теме вызовы той же функции с помощью SIDL_PROFILE возвращает мой действительный (вошедший в систему) каталог пользователя (C: / Docs иНастройки / Я), даже несмотря на то, что консоль, на которой запущен GHCi, имела все env-var, которые я мог найти, с каталогом пользователя в нем, сбрасываемым на флэш-диск.Эти вызовы Win32 просто полностью игнорируют переменные окружения?

1 Ответ

1 голос
/ 25 ноября 2010

Функции Win32 не используют переменные среды для этого, эта информация хранится в других местах. Точное местоположение не имеет значения, поскольку Microsoft учитывает эти детали реализации, поэтому оно может меняться от версии к версии ( Длинная и печальная история о ключе папок оболочки ).

%USERPROFILE% и аналогичные переменные среды предоставляются процессором командной строки в качестве любезности для написания пакетных файлов, поэтому вы можете получить эти местоположения непосредственно из сценария. Изменение переменной среды влияет только на сценарии или на редкое приложение, которое проверяет эти переменные вместо использования SHGetSpecialFolderPath или аналогичных функций (что является рекомендуемым методом для приложений Win32).

Длинный рассказ: вы не можете изменять расположение пользовательских папок для каждого приложения.

...