Adresse relative de LoadLibrary () à dll

J’essaye de charger un dll dans mon code dans windows, je charge mon dll avec succès avec la fonction LoadLibrary () mais j’ai une question, je donne le chemin à mon dll comme:

LoadLibrary(C:\\path\\to\\my\\dll); 

Je me demande si je peux donner le chemin relatif à mon dll. Je veux dire par exemple:

 LoadLibrary(.\my dll directory\my dll.dll) 

C’est possible? sinon, comment puis-je développer mon projet qui peut être portable sans changer le chemin d’access à la DLL dans différentes machines?

Il est très probable que cela échoue car vous avez oublié d’échapper aux barres obliques inverses lors de votre deuxième appel à LoadLibrary. Peut-être que c’était une faute de frappe lorsque vous avez écrit votre question, car vous avez également oublié les guillemets du nom de fichier. 😉 C’est, changez cette ligne:

 LoadLibrary(.\my dll directory\my dll.dll); 

Pour être ceci:

 LoadLibrary(L".\\my dll directory\\my dll.dll"); 

(Et je ne suis pas sûr si le leader .\\ est nécessaire)

Et si cela ne résout pas le problème, cela fera probablement ce dont vous avez besoin:

 wchar_t szFullPath[MAX_PATH] = {}; GetCurrentDirectory(MAX_PATH, szFullPath); PathCchAppend(szFullPath, MAX_PATH, L"my dll directory\\my dll.dll"); HMODULE hDLL = LoadLibrary(szFullPath); 

Et enfin, LoadLibrary a différents comportements pour rechercher des DLL dépendantes. Et cela varie en fonction de la manière dont vous spécifiez le chemin. Cela pourrait être ce qui affecte votre capacité à charger la DLL à partir d’un chemin de recherche relatif. Lisez la page MSDN sur elle et envisagez de consulter les différentes options telles que LoadLibraryEx et SetDllDirectory pour faciliter la gestion des chemins de recherche. Cette page sur les chemins de recherche DLL aussi bien.

Tout d’abord, je suppose que vous vouliez écrire:

 LoadLibrary(".\\my dll directory\\my dll.dll"); 

La documentation répond à votre question:

Si un chemin relatif est spécifié, l’intégralité du chemin relatif est ajouté à chaque jeton dans la liste de chemins de recherche DLL. Pour charger un module à partir d’un chemin relatif sans rechercher un autre chemin, utilisez GetFullPathName pour obtenir un chemin non relatif et appelez LoadLibrary avec le chemin non relatif.

Donc oui, vous pouvez spécifier un chemin relatif. Mais la façon dont cela est interprété n’est peut-être pas ce que vous attendiez. La recherche DLL va prendre chaque chemin dans le chemin de recherche DLL à son tour, combinez cela avec votre chemin relatif et essayez de charger cette DLL.

Par conséquent, si vous souhaitez que votre chemin d’access relatif soit relatif au répertoire de travail en cours, appelez GetFullPathName pour le développer en un chemin absolu, puis chargez-le. Si vous voulez que votre chemin relatif soit interprété par rapport à un autre répertoire, combinez-le avec ce répertoire et chargez la DLL avec un chemin absolu.