2012-10-12 4 views
0

Mon code utilise une bibliothèque qui est une DLL statique/implicitement liée (appelons-la DLLB) mais à l'exécution, elle ne peut pas le trouver. Ceci est en dépit de la localisation de DLLB dans le même répertoire que le code qui l'appelle.Le moyen optimal pour aider les fenêtres à trouver la DLL que je suis lier à?

(Le code appelant est lui-même une DLL, appelée DLLA à partir de python, qui est appelée depuis arcpy.Je ne suis pas sûr pourquoi le python trouve bien DLLA mais DLLA ne trouve pas DLLB, bien qu'ils soient dans le même répertoire) .

Si je place la bibliothèque DLL quelque part sur le chemin du système, tout fonctionne correctement.

Mais quelle est la meilleure approche pour le déploiement? Ajouter une entrée au chemin d'accès système sur l'ordinateur client, au moment de l'installation? Modifier le chemin du système à l'exécution, à partir de python, avant de charger la DLL? Autre chose?

Répondre

3

Python doit spécifier le chemin d'accès complet à la DLL dans l'appel LoadLibrary. C'est une pratique recommandée. Si vous spécifiez uniquement un nom de module, vous risquez de charger la mauvaise DLL, en introduisant éventuellement un binary planting vulnerability. Notez que bien que le chemin de recherche par défaut inclue le répertoire dans lequel l'exécutable a été chargé, il n'inclut pas le répertoire dans lequel les autres DLL ont été chargées. Donc, le comportement que vous voyez est comme prévu.

Si vous pouvez utiliser le chargement dynamique, vous pouvez rechercher le chemin vers DLLA et l'utiliser pour construire le chemin d'accès à DLLB.

Pour obtenir un handle de module pour DLLA, appelez GetModuleHandleEx. Pour obtenir le chemin d'accès complet à DLLA à partir du handle de module, appelez GetModuleFileName. Vérifiez que le dernier élément est DLLA.dll et remplacez-le par DLLB.dll. Vous pouvez ensuite appeler LoadLibrary.

+0

Vous avez raison, je précise le chemin complet de DLLA en Python. DLLB est une bibliothèque tierce qui, hélas, ne supporte pas le chargement dynamique. Qui laisse la question de ce qu'il y a de mieux à faire - modifier le chemin du système? Est-ce que je peux le faire d'une manière ou d'une autre juste pour python et ses charges DLL? –

+0

Vous pouvez toujours charger dynamiquement les DLL. (Eh bien, presque toujours.) Le problème le plus probable est qu'il peut être trop difficile de changer le code dans DLLA pour utiliser un chargement explicite plutôt qu'implicite. Je pense que la meilleure solution serait de charger explicitement DLLB à partir de Python * avant * le chargement de DLLA. La charge implicite trouvera alors la bonne DLL car elle est déjà en mémoire. Cependant, vous pouvez modifier la variable d'environnement PATH pour le processus à l'aide de l'objet de mappage 'os.environ'. Vous voulez probablement ajouter le répertoire à PATH, mais assurez-vous qu'il n'y a rien là qui soit en conflit. –

+0

Aha! http://msdn.microsoft.com/en-us/library/784bt7z7%28v=vs.100%29.aspx –

Questions connexes