Mi primer pensamiento es, si está vinculando estáticamente un dll, no es un complemento. Simplemente coloque el dll en la carpeta EXE y termine con él. Esa es la configuración de implementación admitida por Windows para archivos DLL cargados estáticamente.
Dicho esto, hay formas de lograr lo que desea. Pero son en su mayoría estúpidos o complicados sin una buena razón: Sus opciones son:
- No se puede establecer un vínculo estático. Use LoadLibrary ("plugins/Plugin.dll") & GetProcAddress para acceder al contenido del complemento.
- Agregue "la ruta a su carpeta de complementos" a la variable de entorno PATH del sistema.
- Utilice el mecanismo de carga de retraso para retrasar el acceso a la funcionalidad de los complementos, establezca un custom helper function que pueda cargar el dll (s) utilizando una ruta proporcionada.
- Convierta la carpeta de complementos en un ensamblaje (creando un archivo .manifest en él que enumere plugin.dll). Agregue "complementos" como un ensamblaje dependiente a su aplicación. Ahora se verá en la carpeta de complementos.
- Divida su aplicación en un stub exe y una parte cargada dinámicamente. En el stub exe, llame a SetDllDirectory para que apunte a la carpeta del complemento, luego llame a LoadLibrary pasando la ruta completa a "appstub.dll".
Para activar una carpeta, con una o más de las DLL en una "asamblea", sólo tiene que añadir un archivo a la carpeta con las carpetas name.manifest.
Así, plugins.manifest: -
<assembly manifestVersion="1.0">
<assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" />
<file name="Plugin.dll"/>
</assembly>
Es una muy buena idea para asegurarse de que la carpeta y el nombre del archivo DLL es diferente, como si el nombre de la DLL es las ventanas nombre de ensamblado empieza a buscar en su embebido archivo de manifiesto para obtener información sobre el conjunto.
Suponiendo que está utilizando Visual Studio 7 o posterior, agregue la siguiente directiva a .c/.cpp o.archivo h en el proyecto luego hacer su intento de aplicación para cargar archivos DLL de la asamblea en lugar de sólo el directorio local:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' "\
"processorArchitecture='*' version='1.0.0.0' "\
"type='win32'\"")
Gracias - Ya me he ido con el enfoque GetProcAddress porque no pude entender cómo debe ser el manifiesto para hacer funcionar el enfoque de "montaje falso". Afortunadamente, esto funciona bien con la arquitectura general. – Oliver
No necesita 'SetDllDirectory' para cargar el retraso; hay un gancho '__pfnDliNotifyHook2' para que pueda llamar directamente a' LoadLibrary (". \\ plugins \\ PluginX.dll") '. La idea de '% PATH%' es un poco frágil, ya que es bastante bajo en la lista de ubicaciones para verificar. – MSalters
gracias. Nunca he utilizado personalmente la carga de retraso, así que solo asumí que SetDllDirectory sería la forma de ajustarlo. –