Моя первая мысль: если вы статически связываете dll, это не плагин. Просто поместите dll в папку EXE и покончите с этим. Это конфигурация развертывания, поддерживаемая окнами для статически загружаемых библиотек DLL.
Тем не менее, есть способы достичь того, что вы хотите. Но они в основном глупые или сложные без веской причины. Ваши варианты:
- Не статически связывать. Используйте LoadLibrary ("plugins / Plugin.dll") и GetProcAddress для доступа к содержимому плагина.
- Добавьте «путь к папке с плагинами» в системную переменную среды PATH.
- Используйте механизм отложенной загрузки для отсрочки доступа к функциональности плагинов, установите пользовательскую вспомогательную функцию , которая может загружать dll (и), используя предоставленный путь.
- Превратите папку плагинов в сборку (создав в ней файл .manifest со списком plugin.dll). Добавьте «плагины» в качестве зависимой сборки в ваше приложение. Теперь он будет выглядеть в папке плагинов.
- Разделите ваше приложение на исполняемый файл и динамически загружаемую часть. В заглушке exe вызовите SetDllDirectory, чтобы указать на папку плагина, затем вызовите LoadLibrary, передав полный путь к «appstub.dll».
Чтобы превратить папку с одним или несколькими DLL в «сборку», просто добавьте в папку файл с именем name.manifest.
Итак, plugins.manifest: -
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
<file name="Plugin.dll"/>
</assembly>
Это ОЧЕНЬ хорошая идея, чтобы убедиться, что папка и имя dll отличаются, как если бы имя dll было именем сборки. Windows начинает поиск во встроенном файле манифеста информации о сборке.
Предполагая, что вы используете Visual Studio 7 или более позднюю версию, следующая директива, добавленная в файл .c / .cpp или .h в проекте, затем заставит ваше приложение попытаться загрузить dll из сборки, а не только из локального каталога:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' "\
"processorArchitecture='*' version='1.0.0.0' "\
"type='win32'\"")