83 votes

Obtenir le chemin de la DLL au moment de l'exécution

Je veux obtenir le chemin du répertoire (ou du fichier) d'une dll à l' intérieur de son code. (pas le chemin du fichier .exe du programme)

J'ai essayé quelques méthodes que j'ai trouvées:
GetCurrentDir - récupère le chemin du répertoire actuel.
GetModuleFileName - obtient le chemin de l'exécutable.

Alors, comment puis-je savoir dans quelle dll le code est?
Je cherche quelque chose de similaire à C # 's Assembly.GetExecutingAssembly

139voto

mkaes Points 6867

Je voudrais utiliser la fonction GetModuleHandleEx et obtenir le handle d'une fonction statique dans votre DLL. Vous trouvez plus d'infos ici .

Après cela, vous pouvez utiliser GetModuleFileName pour obtenir le chemin à partir du descripteur que vous venez d’obtenir. Plus d'infos sont ici .

Un exemple complet:

 char path[MAX_PARAM];
HMODULE hm = NULL;

if (!GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | 
        GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
        (LPCSTR) &localFunc, 
        &hm))
{
    int ret = GetLastError();
    fprintf(stderr, "GetModuleHandle returned %d\n", ret);
}
GetModuleFileNameA(hm, path, sizeof(path));
 

46voto

cprogrammer Points 2340
 EXTERN_C IMAGE_DOS_HEADER __ImageBase;
 

....

 WCHAR   DllPath[MAX_PATH] = {0};
GetModuleFileNameW((HINSTANCE)&__ImageBase, DllPath, _countof(DllPath));
 

24voto

Remy Lebeau Points 130112

GetModuleFileName() fonctionne correctement à l'intérieur des codes de la DLL. Veillez simplement à ne PAS définir le premier paramètre sur NULL , car cela obtiendra le nom du fichier du processus appelant. Vous devez plutôt spécifier l'instance de module réelle de la DLL. Vous obtenez cela en tant que paramètre d'entrée dans la fonction DllEntryPoint() la DLL, il vous suffit de l'enregistrer dans une variable quelque part pour une utilisation ultérieure, si nécessaire.

1voto

Mythli Points 1063

Essayez la fonction GetModuleFileName .

-4voto

freedompeace Points 4717
HMODULE hmod = GetCurrentModule();
TCHAR szPath[MAX_PATH + 1] = 0;
DWORD dwLen = GetModuleFileHName(hmod, szPath, MAX_PATH);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X