OVH Cloud OVH Cloud

Nom de la DLL

5 réponses
Avatar
JGP_NoMail
Bonjour,

Comment connaitre le nom du fichier dll ou le handle de la DLL ?

- GetModuleFileName( NULL, ModuleFileName,sizeof(ModuleFileName));
Me donne le nom du programme appelant

- GetModuleHandle( NULL);
Me donne le handle du programme appelant


- GetModuleFileName( GetModuleHandle( "madll.dll"),
ModuleFileName,sizeof(ModuleFileName));

Me donne bien le nom complet de ma Dll, mais il faut deja que je
connaisse le nom de la Dll


Cordialement,

JGP

5 réponses

Avatar
Vincent Burel
"JGP_NoMail" wrote in message
news:d2gjgj$9t3$
Bonjour,

Comment connaitre le nom du fichier dll ou le handle de la DLL ?

- GetModuleFileName( GetModuleHandle( "madll.dll"),
ModuleFileName,sizeof(ModuleFileName));

Me donne bien le nom complet de ma Dll, mais il faut deja que je
connaisse le nom de la Dll



ben si vous avez le nom complet, vous avez le nom, suffit de suprimer tout
ce qui a avant le dernier slash.

VB
Avatar
Serge Paccalin
Le jeudi 31 mars 2005 à 12:44, JGP_NoMail a écrit dans
fr.comp.os.ms-windows.programmation :

Bonjour,

Comment connaitre le nom du fichier dll ou le handle de la DLL ?

- GetModuleFileName( NULL, ModuleFileName,sizeof(ModuleFileName));
Me donne le nom du programme appelant

- GetModuleHandle( NULL);
Me donne le handle du programme appelant

- GetModuleFileName( GetModuleHandle( "madll.dll"),
ModuleFileName,sizeof(ModuleFileName));

Me donne bien le nom complet de ma Dll, mais il faut deja que je
connaisse le nom de la Dll

Cordialement,

JGP



J'ai bien trouvé une méthode, mais elle est un peu lourde, et nécessite
PSAPI.DLL (donc NT, 2000, XP).

1. Écrire une fonction GetModuleFromProcAddress() qui fait :

1.1. Appeler EnumProcessModules() pour obtenir un tableau des handles
des DLL du process

1.2. Pour chaque handle, appeler GetModuleInformation() pour connaître
l'adresse de chargement et la taille occupée par chaque DLL, jusqu'à
trouver celle qui contient une adresse de code donnée.

2. Écrire une fonction GetModuleSelf() qui appelle la précédente en lui
donnant son adresse (de l'appelant, donc) comme paramètre. La mettre
dans un ".h" si on veut l'utiliser un peu partout.

Voilà. Quand tu appelles GetModuleSelf(), tu botiens le handle la DLL où
elle se trouve, et tu peux appeler GetModuleFileName() dessus.

------------------------------------------------------------
#include <psapi.h>

HINSTANCE GetModuleFromProcAddress(FARPROC pHere)
{
HINSTANCE hMe = NULL;

// Enumérer toutes les DLL du processus
// Obtient handles de tous les modules chargés par le process
HANDLE hProcess = ::GetCurrentProcess();
HMODULE ahMods[1024] = {0};
DWORD nNeeded = 0;

EnumProcessModules(hProcess,ahMods,sizeof ahMods,&nNeeded);

DWORD nCount = sizeof ahMods / sizeof ahMods[0];
if (nNeeded <= sizeof ahMods)
{
nCount = nNeeded / sizeof ahMods[0];
}

// Chercher celle qui contient l'adresse de notre fonction
for (DWORD nMod = 0; (nMod < nCount) && (NULL == hMe); ++nMod)
{
MODULEINFO Info = {0};
GetModuleInformation(hProcess,ahMods[nMod],&Info,sizeof Info);
if (((LPBYTE)Info.lpBaseOfDll <= (LPBYTE)pHere)
&& ((LPBYTE)Info.lpBaseOfDll + Info.SizeOfImage > (LPBYTE)pHere))
{
hMe = ahMods[nMod];
}
}
}

return hMe;
}

// Dans un ".h"

static HINSTANCE GetModuleSelf()
{
return GetModuleFromProcAddress((FARPROC)GetModuleSelf);
}



--
___________ 31/03/2005 15:07:38
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763
Avatar
Serge Paccalin
Le jeudi 31 mars 2005 à 12:44, JGP_NoMail a écrit dans
fr.comp.os.ms-windows.programmation :

Bonjour,

Comment connaitre le nom du fichier dll ou le handle de la DLL ?

- GetModuleFileName( NULL, ModuleFileName,sizeof(ModuleFileName));
Me donne le nom du programme appelant

- GetModuleHandle( NULL);
Me donne le handle du programme appelant

- GetModuleFileName( GetModuleHandle( "madll.dll"),
ModuleFileName,sizeof(ModuleFileName));

Me donne bien le nom complet de ma Dll, mais il faut deja que je
connaisse le nom de la Dll

Cordialement,

JGP



J'ai bien trouvé une méthode, mais elle est un peu lourde, et nécessite
PSAPI.DLL (donc NT, 2000, XP).

1. Écrire une fonction GetModuleFromProcAddress() qui fait :

1.1. Appeler EnumProcessModules() pour obtenir un tableau des handles
des DLL du process

1.2. Pour chaque handle, appeler GetModuleInformation() pour connaître
l'adresse de chargement et la taille occupée par chaque DLL, jusqu'à
trouver celle qui contient une adresse de code donnée.

2. Écrire une fonction GetModuleSelf() qui appelle la précédente en lui
donnant son adresse (de l'appelant, donc) comme paramètre. La mettre
dans un ".h" si on veut l'utiliser un peu partout.

Voilà. Quand tu appelles GetModuleSelf(), tu obtiens le handle de la DLL
où elle se trouve, et tu peux appeler GetModuleFileName() dessus.

------------------------------------------------------------
#include <psapi.h>

HINSTANCE GetModuleFromProcAddress(FARPROC pHere)
{
HINSTANCE hMe = NULL;

// Enumérer toutes les DLL du processus
// Obtient handles de tous les modules chargés par le process
HANDLE hProcess = ::GetCurrentProcess();
HMODULE ahMods[1024] = {0};
DWORD nNeeded = 0;

EnumProcessModules(hProcess,ahMods,sizeof ahMods,&nNeeded);

DWORD nCount = sizeof ahMods / sizeof ahMods[0];
if (nNeeded <= sizeof ahMods)
{
nCount = nNeeded / sizeof ahMods[0];
}

// Chercher celle qui contient l'adresse de notre fonction
for (DWORD nMod = 0; (nMod < nCount) && (NULL == hMe); ++nMod)
{
MODULEINFO Info = {0};
GetModuleInformation(hProcess,ahMods[nMod],&Info,sizeof Info);
if (((LPBYTE)Info.lpBaseOfDll <= (LPBYTE)pHere)
&& ((LPBYTE)Info.lpBaseOfDll + Info.SizeOfImage > (LPBYTE)pHere))
{
hMe = ahMods[nMod];
}
}
}

return hMe;
}

// Dans un ".h"

static HINSTANCE GetModuleSelf()
{
return GetModuleFromProcAddress((FARPROC)GetModuleSelf);
}



--
___________ 31/03/2005 15:07:38
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763
Avatar
Aurélien REGAT-BARREL
> - GetModuleFileName( NULL, ModuleFileName,sizeof(ModuleFileName));
Me donne le nom du programme appelant



Il faut utiliser le hinstDll reçu dans DllMain() au lieu de NULL.

--
Aurélien REGAT-BARREL
Avatar
JGP_NoMail
Le 31/03/2005 15:49, Aurélien REGAT-BARREL a écrit :
- GetModuleFileName( NULL, ModuleFileName,sizeof(ModuleFileName));
Me donne le nom du programme appelant




Il faut utiliser le hinstDll reçu dans DllMain() au lieu de NULL.




Ok, Dire que c'est si simple ! ;-)

Merci a tous.