2010-11-24 1 views
0

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

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

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

+0

В качестве примечания я обнаружил, что вызов по вызову через этот билет для Cabal: http://hackage.haskell.org/trac/hackage/ticket/709. Что бы ни происходило в SHGetFolderPath, это может помочь. – CodexArcanum 2010-11-24 21:52:08

ответ

1

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

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

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