Способ заставить SearchPath API не смотреть в c:\windows?

Есть ли способ получить SearchPath API, чтобы не выполнять поиск в c:\windows при использовании пути поиска по умолчанию (передавая NULL в качестве первого параметра)? Я не могу изменить вызывающего абонента для отправки по определенному пути.

У меня есть система с ini-файлом приложения в c:\windows (который я не хочу использовать, но по устаревшим причинам должен оставаться там). Я поместил свою копию того же ini-файла в c:\users\public и поместил c:\users\public в начало переменной среды системного пути, но вызов SearchPath по-прежнему находит версию c:\windows. Если я удалю эту версию, она найдет версию c:\users\public, поэтому я знаю, что путь был задан правильно.


person Jeremy Mullin    schedule 06.10.2008    source источник


Ответы (3)


Согласно MSDN, вы ничего не можете сделать об этой панели, изменяющей запись реестра на системном уровне (HKLM) (что является «плохим делом»). Изменение реестра приведет к тому, что порядок поиска будет начинаться с текущего рабочего каталога, который вы можете установить на нужную папку в ярлыке. (Опять же, я хочу сказать, изменение записи реестра на уровне машины для этого - потенциально опасно!)

Вы просматривали прокладки приложений? Это может быть что-то, что может сработать для вас.

person Rob    schedule 06.10.2008

Я знаю, что это очень поздно, но, только что столкнувшись с этой проблемой, я бы предложил лучшее решение.

Первый аргумент SearchPath, как вы обнаружили, можно использовать чтобы указать каталоги, в которых вы хотите искать, вместо порядка по умолчанию. Вы можете получить и использовать PATH текущего пользователя с помощью GetEnvironmentVariable, а затем поиск внутри этого:

DWORD err = GetEnvironmentVariable("PATH", NULL, 0);
char* path = new char[err+1];   path[err] = 0;
GetEnvironmentVariable("PATH", path, err);

err = SearchPath(path, "application", ".ini", 0, NULL, NULL);
char* searchResult = new char[err+1];   searchResult[err] = 0;
err = SearchPath(path, "application", ".ini", err, searchResult, NULL);
person Jason Owen    schedule 15.06.2009

Попробуйте SetCurrentDirectory("c:\users\public"), а затем SearchPath(...).

person akalenuk    schedule 07.10.2008
comment
Спасибо, SearchPath вызывается внутри библиотеки, поэтому мне действительно не следует возиться с текущим каталогом приложений. Кроме того, разные пользователи захотят использовать разные пути, я не могу жестко закодировать это. Я буду использовать переменную среды, которую могут установить пользователи, и я буду использовать этот путь вместо передачи NULL в SearchPath. - person Jeremy Mullin; 07.10.2008
comment
Да, это кажется лучшим решением. - person akalenuk; 07.10.2008