Как установить путь поиска DLL для COM-сервера от клиента? - PullRequest
0 голосов
/ 06 июня 2018

Я создаю экземпляр COM-сервера с помощью CoCreateInstance ().Мой COM-сервер загружает некоторые библиотеки динамически позже.Но он не может найти эти библиотеки.Одним из решений этой проблемы является добавление этих путей в переменную PATH env, чего я хочу избежать.Я не могу установить его в коде, так как сервер уже загружен, и он не будет соблюдать PATH, установленные после его загрузки.Наилучшим решением может быть то, что клиент должен иметь возможность задать путь поиска COM-сервера.Является ли это возможным?Как?

1 Ответ

0 голосов
/ 06 июня 2018

Предполагая, что COM-сервер загружает библиотеки DLL только по имени:

  • Если COM-сервер является встроенной DLL, он загружается в процесс клиента, поэтому клиент может использоватьSetDllDirectory() или AddDllDirectory() для себя, и сервер будет включать этот дополнительный путь при загрузке DLL.

  • Если COM-сервер находится вне EXE-файла, клиент не можетвлиять на пути поиска сервера, не изменяя глобальную среду PATH перед загрузкой сервера, если только сервер не предоставляет метод COM, который клиент может вызвать, чтобы позволить серверу изменять свои собственные пути поиска.

    Однако, если выможно поместить DLL-файлы в ту же папку, что и EXE-файл сервера, это будет первое место, где ОС их ищет, тогда вам вообще не придется возиться с путями поиска.

Если вы можете изменить сервер для загрузки библиотек DLL по абсолютным путям, то вы можете поместить библиотеки DLL в папку, путь которой относительно пути установки сервера, и заставить сервер получать свои данные.n путь к папке во время выполнения (через GetModuleFileName(), убирая имя файла), а затем добавьте относительный путь каждой DLL + имя файла к этому базовому пути установки.

Или поместите библиотеки DLL в любое место и сохраните эти путигде-то во внутренней конфигурации вашего сервера.

Или зарегистрируйте библиотеки DLL в реестре, чтобы ОС знала, где их найти:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
...