2013-09-25 3 views
0

J'ai besoin d'utiliser libcurl.dll dans mon programme (le binaire s'appuyer sur libcurl.dll dans mon programme est "A.exe"), le libcurl.dll s'appuyer sur zlib1.dll, libeay32.dll , ssleay32.dll. mais il existe une autre version libeay32.dll qui existe déjà dans le dossier de A.exe. Donc, je prévois de créer un dossier "CURL" et mettre le nouveau 4 DLL que j'ai introduit cette fois, puis utiliser la charge DLL dynamique pour invoquer le libcurl.dll.Windows DLL dynamique charge

=====================

 
Main folder 

| 

A.exe, 

libeay32.dll(old one), 

Folder "CURL" ----- 

        | 
        | 
       libcurl.dll, zlib1.dll, libeay32.dll, ssleay32.dll 

===================== 

La question est que comment puis-je contrôler mon programme pour charger la DLL dans le dossier "curl" . Je peux contrôler "A.exe" charger CURL \ libcurl.dll par appel

HMODULE hModule = LoadLibrary (_T ("Curl \ libcurl.dll")); Mais comment puis-je contrôler le chemin de zlib1.dll, libeay32.dll, ssleay32.dll. Il semble que Windows recherche la DLL dans le dossier dont A.exe local est par défaut.

+0

Je trouve une solution qui peut fonctionner sur une version haute OS. chargez la DLL en utilisant: LoadLibraryEx ("FullPathofA.exe", NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_DEFAULT_DIRS); Existe-t-il une méthode de travail sur les OS de version basse. Windows 7, Windows Server 2008 R2, Windows Vista et Windows Server 2008: cette valeur nécessite l'installation de KB2533623. Windows Server 2003 et Windows XP: cette valeur n'est pas prise en charge. – Leon

+0

Je ne pense pas que ce schéma fonctionnera: 'libeay32.dll' est déjà chargé, donc il ne sera pas chargé à nouveau - même si les versions diffèrent! – MSalters

+0

@MSalters Mais que se passe-t-il s'il charge la bonne version de libeay32.dll, comme je l'ai dit, avant de charger libcurl.dll? – SamuelVimes

Répondre

0

Utilisez les paramètres de répertoire d'inclusion de votre compilateur. ou/et utilise la logique Windows pour trouver les DLL dépendantes. (Vous pouvez utiliser des outils comme filemon ou process monitor pour voir quel répertoire a été recherché)

Utilisez le chemin de recherche de Windows. La commande est:

  1. Le répertoire où se trouve le module exécutable pour le processus en cours.

  2. Le répertoire en cours.

  3. Le répertoire système Windows. La fonction GetSystemDirectory récupère le chemin de ce répertoire.

  4. Le répertoire Windows. La fonction GetWindowsDirectory récupère le chemin de ce répertoire.

  5. Les répertoires répertoriés dans la variable d'environnement PATH.

+0

Je pense que vous ne comprenez pas ma question, je connais la séquence que les fenêtres de recherche Windows. Je veux ajouter mon dossier "CURL" dans la liste de recherche et en faire le premier dossier Windows rechercher les DLL. – Leon

+0

oke désolé, quel OS/IDE/compilateur utilisez-vous – lordkain

0

Vous devriez être en mesure de le charger avec LoadLibrary si vous spécifiez le chemin complet vers le dll au lieu d'un par rapport à l'appel. Lorsque vous utilisez uniquement le nom de fichier ou un chemin relatif, l'ordre de recherche est défini par lordKain (sauf si vous le modifiez, par exemple en appelant le SetDllDirectory). Toutefois, lorsque vous utilisez le chemin complet, recherchez uniquement l'emplacement spécifié. Vous pouvez d'abord charger de cette façon la version de libeay32.dll dont vous avez besoin, de sorte que lorsque vous chargez libcurl.dll, la version de libeay32.dll que vous voulez est déjà chargée. Veillez également à ce qu'il n'y ait pas de manifeste de redirection dll.