ajouter DLL personnalisée chemin de recherche @ démarrage de l'application
Je suis de rayonnages de mon cerveau en essayant de trouver une solution élégante à un DLL problème de charge. J'ai une application qui statiquement des liens vers d'autres fichiers lib qui charge les Dll. Je ne suis pas le chargement de la Dll directement. J'aimerais avoir des Dll dans un autre dossier autre que le dossier que l'exécutable est dans. Quelque chose comme %working_folder%\dll - je préfère ne pas en avoir des dizaines (oui ... des dizaines) de la Dll dans mon %working_folder%.
Je suis en train de développer quelque chose qui fait partie de l'application principale qui va ajuster le chemin de recherche @ démarrage. Le problème, je suis en cours d'exécution, c'est que cette nouvelle DLL personnalisée chemin d'accès n'est pas dans le chemin de recherche du système. Lorsque je démarre l'application, elle se bloque (STATUS_DLL_NOT_FOUND) parce que la Dll ne sont pas dans les endroits appropriés. Ce que je voudrais faire est de vérifier @ démarrage si cette nouvelle DLL personnalisée dossier est dans le processus de la variable d'environnement chemin de recherche et si ne pas l'ajouter. Le problème est, l'application tente de charger tous ces Dll avant que l'application s'exécute une seule ligne de code.
Comment puis-je résoudre ce problème? J'ai envisagé d'écrire une application aide qui démarre en premier, ajuste les variables d'environnement de façon adéquate et le lance l'application via la fonction CreateProcess. Cela fonctionne, j'en suis sûr, mais il rend les choses difficiles sur les développeurs. Quand ils le débogage de l'application principale qu'ils ne vont pas lancer d'une aide de première application - non pas qu'ils pouvaient encore le faire.
J'ai essayé le registre chemin de app fonctionnalité, sans succès. Même poule et de l'œuf problème comme avant.
Que puis-je faire ici?
OriginalL'auteur | 2008-11-29
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la réponse de Matthieu a travaillé pour moi.
Dans visual studio 2012 goto vos propriétés du projet et dans
Propriétés de Configuration->Linker->Input->Retard Dll Chargées
ajouter chaque fichier dll que vous ne voulez pas charger jusqu'à ce que nécessaire.
Bien qu'il n'a plus besoin de courir avant de main, c'est mon code pour définir le nouveau chemin de recherche
OriginalL'auteur David Woo
[Edit - après re-lecture de la question, je vois que le problème que vous rencontrez est que les Dll sont à consommer avant
main
commence]Je suppose que ceux des bibliothèques écrites en C++ et sont de chargement de la Dll à partir du constructeur de certains objets dans la portée globale. C'est problématique. Permettez-moi de citer Yossi Kreinin:
[Original de la réponse ci-dessous]
Voir cette page pour l'algorithme de recherche utilisé pour le chargement des Dll. Vous pouvez utiliser
SetDllDirectory()
pour ajouter un répertoire à la DLL chemin de recherche.Vous devez également être en mesure d'ajouter un répertoire à la variable d'environnement PATH en utilisant
GetEnvironmentVariable()
etLesetenvironmentvariable()
.Une autre option est de changer le répertoire de travail actuel dans le dossier contenant les Dll avec
SetCurrentDirectory()
. Assurez-vous de changer le répertoire de travail de retour après le chargement de la Dll si jamais vous charger tous les fichiers à l'aide relative des noms de fichiers.OriginalL'auteur Adam Rosenfield
Ma recommandation est d'utiliser delayload de liaison pour les Dll et d'appel SetDllDirectory() suffisamment tôt pour qu'il puisse s'y retrouver quand les méthodes/fonctions sont appelées.
OriginalL'auteur Matthew