Modification du chemin de recherche des DLL pour les DLL liées statiquement
Dilemme :
Lors de la liaison statique d'un DLL à une application, il recherche généralement la DLL dans le répertoire de l'application. Toutefois, dans certains scénarios, la DLL peut ne pas se trouver dans le même répertoire. Par exemple, il pourrait résider dans un sous-dossier désigné pour les « plugins ».
Solutions possibles :
1. Liens dynamiques :
Envisagez d'utiliser LoadLibrary() et GetProcAddress() au lieu d'un lien statique pour accéder aux fonctionnalités du plugin. Cela offre une plus grande flexibilité dans le chargement de la DLL à partir de son emplacement désigné.
2. Modification de la variable d'environnement :
L'ajout du chemin du dossier du plugin à la variable d'environnement PATH du système garantit que la DLL peut être localisée et chargée avec succès.
3. Mécanisme de chargement différé :
Utilisez le mécanisme de chargement différé pour différer le chargement de la fonctionnalité du plugin. Implémentez une fonction d'assistance personnalisée qui charge les DLL en utilisant un chemin fourni.
4. Création d'assembly :
Transformez le dossier du plugin en un assembly en générant un fichier .manifest en son sein. Désignez le dossier "plugins" comme assembly dépendant au sein de l'application. Cela dirige la recherche de DLL dans le dossier du plugin.
5. Application stub et chargement dynamique :
Subdivisez l'application en un exécutable stub et un composant chargé dynamiquement. Dans l'exécutable stub, utilisez SetDllDirectory pour indiquer le dossier du plugin. Ensuite, appelez LoadLibrary en passant le chemin complet vers le fichier "appstub.dll".
Conseils supplémentaires :
Transformer un dossier en assemblage :
Pour transformer un répertoire contenant des DLL en assembly, ajoutez un fichier nommé "[folder_name].manifest" au dossier avec le contenu suivant :
<assembly manifestVersion="1.0"> <assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" /> <file name="Plugin.dll"/> </assembly>
Directive Pragma pour le chargement des DLL :
Dans Visual Studio 7 ou version ultérieure, utilisez la directive pragma suivante pour demander à votre application de récupérer les DLL de l'assembly plutôt que du répertoire local :
#pragma comment(linker, "/manifestdependency:\"name='Plugins' \ processorArchitecture='*' version='1.0.0.0' \ type='win32'\"")
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!