DLL плагинов, которые зависят от других DLL - PullRequest
9 голосов
/ 05 февраля 2010

Я пишу DLL для подключения к другому (стороннему) приложению. DLL должна зависеть от другого набора DLL (по причинам лицензии я не могу связать статически).

Я бы хотел, чтобы моя DLL была "xcopy-deployable" для любого каталога. Я также хотел бы не требовать добавления этого каталога в путь.

Если я просто собираю DLL обычным способом, Windows откажется загружать DLL, так как не может найти DLL рядом с текущим процессом.

Есть ли хорошие способы помочь Windows найти DLL?


Чтобы ответить на несколько вопросов:

  • DLL написана на C ++.
  • Дополнительные библиотеки DLL - это QT-dll.
  • Я хотел бы разместить дополнительные DLL в той же папке, что и моя библиотека плагинов. Я могу получить имя этой папки из GetModuleFileName.
  • Приложение - Firefox, DLL - модуль безопасности PKCS # 11.
  • Приложение загружает DLL, используя полный путь к DLL (пользователь указывает ее при установке плагина).
  • Требование размещения DLL-файлов в System32 или рядом с приложением будет работать, но это немного запутанно и может вызвать проблемы с программами удаления.
  • LoadLibrary и GetProcAddress, конечно, будут работать, но в моем случае это не реально. Я использую сотни, если не тысячи, методов в других DLL. Мне действительно нужно использовать библиотеки импорта.

Я думал об использовании загруженных с задержкой DLL в сочетании с SetDllDirectory в DllMain. Кто-нибудь пробовал что-нибудь подобное?

Ответы [ 3 ]

4 голосов
/ 05 февраля 2010

Я могу придумать 3 способа.

  1. поместите dll в ту же папку, что и ваше приложение (вы не можете этого сделать?)
  2. Использовать ссылки во время выполнения. LoadLibrary() и GetProcAddress()
  3. Использовать манифест http://msdn.microsoft.com/en-us/library/aa374182(VS.85).aspx

Но если dll не находится в той же папке, что и .exe, как вы узнаете, где он находится? забыть Windows не зная, как вы знаете?

1 голос
/ 05 февраля 2010

вы можете указать путь к dll в качестве параметра LoadLibrary ().

0 голосов
/ 08 мая 2017

Другой вариант - изменить переменную PATH. Иметь пакетный файл для запуска основного приложения и установить PATH =% PATH%;% ~ dp0. Это обеспечивает минимальную площадь, без каких-либо дополнительных следов в системе после запуска.

...