LoadLibrary() adresse relative à la dll
Je suis en train de charger une dll dans mon code dans windows, je charge ma dll avec succès avec la fonction LoadLibrary() mais j'ai une question, je donne le chemin d'accès à ma dll comme:
LoadLibrary(C:\\path\\to\\my\\dll);
Je me demande si je peux lui donner le chemin d'accès relatif à ma dll. Je veux dire par exemple:
LoadLibrary(.\my dll directory\my dll.dll)
Est-il possible? si non, comment puis-je développer mon projet qui peut être portable sans changer le chemin de la dll dans différentes machines?
Avez-vous l'essayer?
oui, il ne charge pas 🙁
oui, il ne charge pas 🙁
OriginalL'auteur A23149577 | 2013-02-25
Vous devez vous connecter pour publier un commentaire.
Il est probablement défectueux parce que vous avez oublié d'échapper à l'barres obliques inverses dans votre deuxième appel à LoadLibrary. Peut-être que c'était une faute de frappe lors de l'écrit à votre question, parce que vous avez aussi oublié les guillemets pour le nom de fichier. 😉 C'est le cas, modifiez cette ligne:
À ceci:
(Et je ne suis pas sûr si le premier
.\\
est nécessaire)Et si cela ne résout pas le problème, alors ce sera très probablement faire ce que vous avez besoin de:
Et enfin, LoadLibrary a des comportements différents pour la recherche de Dll dépendantes. Et il varie en fonction de la façon dont vous spécifiez le chemin d'accès. Que peut-être ce qui est un impact sur votre capacité de charger la DLL à partir d'un relatif chemin de recherche. Lire la page MSDN sur elle et envisager de regarder les différentes options des appels tels que LoadLibraryEx et SetDllDirectory pouvez faire pour rendre la recherche des chemins plus faciles à traiter. Cette page sur les DLL, les chemins de recherche ainsi.
Arrêter d'utiliser des chemins relatifs. Tout convertir un chemin d'accès complet avant d'appeler la fonction LoadLibrary. Aussi, regardez la AddDllDirectory() la fonction en plus de SetDllDirectory.
"Arrêter d'utiliser des chemins relatifs." Yep. C'est la façon de le faire. Vous a dit beaucoup de choses dans votre réponse. Comme je n'ai dans le mien.
Utiliser chemin d'accès relatif ou utilisation chemin absolu créé dynamiquement, mais jamais utilisation direct chemin absolu une Dll. Remarque, le lecteur "C:" pas nécessairement égal à lecteur de système!
OriginalL'auteur selbie
Tout d'abord, je suppose que tu as voulu écrire:
La la documentation répond à votre question:
Donc oui, vous pouvez spécifier un chemin d'accès relatif. Mais la façon dont il est interprété est peut-être pas ce que vous attendiez. La DLL de recherche aura lieu à chaque chemin dans la DLL chemin de recherche, à son tour, la combiner avec votre chemin relatif, et essayez de charger de cette DLL.
Donc, si vous voulez que votre chemin d'accès relatif à l'être relatif au répertoire de travail courant, appelez
GetFullPathName
à l'étendre à un chemin d'accès absolu, et ensuite charger ce. Si vous voulez que votre chemin relatif pour être interprétés par rapport à un autre répertoire, puis de les combiner avec ce répertoire et de charger la DLL avec un chemin absolu.".;"
.Qui fait quelque chose d'autre. Parce que le reste du chemin de recherche seront recherchés. Si vous voulez charger une DLL dont la position est donnée par un chemin d'accès relatif, toujours le meilleur pour élargir le chemin d'accès absolu et de la charge que.
Je suis d'accord. Je n'ai pas dit que c'était une meilleure possibilité. Si vous voulez charger une bibliothèque à partir d'un emplacement spécifique (et vous n'aurez en général), alors il est certainement préférable de spécifier le chemin d'accès complet (peut-être déterminé dynamiquement à l'aide de
GetModuleFileName
. (Bien qu'il est plutôt bizarre que Windows utilise la variable de chemin d'accès quand on lui donne un nom commençant par"./"
. Je pense que c'est une fonctionnalité de sécurité---il semble un peu dangereux de charge basé sur le répertoire courant.)Oui, en s'appuyant sur le répertoire en cours est une très mauvaise idée.
OriginalL'auteur David Heffernan