2010-07-22 3 views
4

Dans un de mes projets, j'utilise une application Delphi qui charge dynamiquement une DLL wrapper (exportant des fonctions C-Style) qui à son tour est statiquement liée à un tas de DLL tierces.Bibliothèques infernales (alias DLL Hell)

Cela fonctionne très bien sur mes machines de test, mais sur l'ordinateur de mes clients, il a échoué à initialiser avec un message d'erreur comme "Impossible de trouver entrypoint _somefunction @ 4AKKZ dans TMYlibrary.dll".

Après enquête avec le moniteur de processus de Sysinternals, j'ai réalisé que Windows regarderait fror DLL dans les fenêtres/sytem32 d'abord, donc si une DLL nommée semblable à mon DLL était présent dans system32, fenêtres choisirais celui-là et essayer de trouve mes points d'entrée dans la fonction - ce qui échouerait.

Connaissez-vous une possibilité de changer la DLL de Windows le comportement de recherche?


Informations supplémentaires

  • [Mise à jour ] Le fichier .exe est situé au niveau supérieur de l'arborescence des dossiers de l'application.
  • Le Wrapper et le 3e parti DLLs ar e tous deux situés dans le sous-/ bin de mes applications dossier
  • plate-forme Dev est Windows XP/7, en utilisant VS2008 pour le DLLL et Delphi 2010 pour l'application
+0

Où est le fichier EXE situé? Aussi dans le dossier \ bin? –

Répondre

13

Je trouve une autre solution moi-même:

SetDllDirectory ajoute un chemin de recherche supplémentaire à la liste des endroits à voir.

De http://msdn.microsoft.com/en-us/library/ms686203%28v=VS.85%29.aspx

Après avoir appelé SetDllDirectory, le chemin de recherche DLL est:

  1. Le répertoire à partir duquel l'application chargée.
  2. Le répertoire spécifié par le paramètre lpPathName.
  3. Le répertoire du système. Utilisez la fonction GetSystemDirectory pour obtenir le chemin de ce répertoire. Le nom de ce répertoire est System32.
  4. Le répertoire système 16 bits. Il n'y a aucune fonction qui obtient le chemin de ce répertoire, mais c'est recherché. Le nom de ce répertoire est Système.
  5. Le répertoire Windows. Utilisez la fonction GetWindowsDirectory pour obtenir le chemin de ce répertoire.
  6. Les répertoires répertoriés dans la variable d'environnement PATH.

(peut-être que je devrais faire mon googler avant de poster sur le SO;)

+2

+1 parce qu'il est toujours bon quand quelqu'un prend le temps de donner une réponse correcte, surtout quand il était celui qui l'a demandé en premier lieu :) – ereOn

+0

quelqu'un pourrait juste google et frapper cette question SO. Ce qui est utile Cela vaut donc la peine de poser et de répondre à votre propre question. –

+0

@warren: Bon point. C'est en fait comme ça que je suis entré en contact avec ce site. – sum1stolemyname

1

Exportez la DLL dans le dossier de votre programme. (même chose que le fichier exe).

Ensuite, Windows devrait d'abord essayer votre version.

+0

C'est ce qu'il a fait. Avez-vous lu la question? Ou l'a-t-il? La question est ambiguë et n'indique pas où se trouve le fichier EXE. –