Как я могу поместить зависимость плагина DLL в определенном c месте относительно него, чтобы он находился во время выполнения? - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу программу A.exe, которая использует LoadLibrary для загрузки внешней DLL B.dll во время выполнения.

B.dll находится в указанном каталоге c рядом с A.exe , но не в том же каталоге, что и A.exe. A.exe знает, где его найти во время выполнения.

B.dll динамически связан (с помощью G CC, а не во время выполнения) с другой DLL, C .dll.

Во время выполнения все работает успешно, если они настроены так:

myapp/
. . . . A.exe
. . . . C.dll
. . . . myplugins/
. . . . . . . . . B.dll

Однако я бы хотел, чтобы все было настроено так:

myapp/
. . . . A.exe
. . . . myplugins/
. . . . . . . . . B.dll
. . . . . . . . . C.dll

В этой настройке LoadLibrary завершается неудачно при загрузке B.dll, потому что он не может найти свою зависимость C.dll, поскольку он не находится в том же каталоге, что и исполняемый файл хоста.

Как заставить предпочтительную настройку работать без A.exe или процесс сборки, который знает что-нибудь о C .dll? Идея состоит в том, что B.dll является плагином для A.exe, поэтому A.exe знает, где его найти. Однако он не должен знать ничего о C .dll. Только B.dll должен знать что-либо о C .dll.

1 Ответ

0 голосов
/ 03 апреля 2020

Оказывается, в WinAPI есть простой способ удовлетворить именно это требование!

Решение, найденное в документах для динамических файлов c порядок поиска в библиотеке и документах для LoadLibraryEx.

Вместо использования LoadLibrary нам нужно использовать LoadLibraryEx. Насколько я понимаю, главное различие между ними заключается в том, что последний принимает необязательный аргумент flags для настройки того, что он делает.

В флагах LoadLibraryEx мы можем передать LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR, чтобы указать, что при загрузке DLL, только каталог, в котором она находится, должен быть проверен на наличие зависимостей. Если мы также хотим, чтобы Windows просматривал обычный путь поиска, мы можем объединить его с LOAD_LIBRARY_SEARCH_DEFAULT_DIRS.

Пример:

HMODULE handle = LoadLibraryExA(
    path, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);

Я мог бы быть неточным в деталях, обратитесь к к указанной документации по мере необходимости.

Спасибо @IInspectable за то, что указал мне правильное направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...