Почему изменение %USERPROFILE% приводит к сбою sHGetFolderPath SIDL_APPDATA?

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

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

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


person CodexArcanum    schedule 24.11.2010    source источник
comment
В качестве примечания, я обнаружил вызов вызывающего нарушение метода через этот билет для Cabal: hackage.haskell. org/trac/hackage/ticket/709 Что бы ни происходило в SHGetFolderPath, это может решить эту проблему.   -  person CodexArcanum    schedule 25.11.2010


Ответы (1)


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

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

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

person Alberto Martinez    schedule 24.11.2010