IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Récupérer le chemin d'un module (exe ou dll) à partir de son handle

Date de publication : 24/02/2005

Par Pierre Castelain (Contributions)
 

Une fonction permettant de récupérer le chemin exact d'un module (exécutable ou dll) par son handle



Une fonction relativement utile quand on veut connaître le chemin d'une dll, en particulier s'il s'agit d'une dll COM.

Cette fonction gère correctement les 2 types de système d'exploitation possibles (Win9x et WinNT).

interface uses Windows; function GetDLLFilename(DLLHandle: THandle): string; implementation uses SysUtils, PsAPI, TlHelp32; function _GetModuleFileNameEx(AProcess: DWORD; AModule: HMODULE; StringSize : integer = MAX_PATH): string; var lpFileNameEx: PChar; nSize: Cardinal; res: DWORD; begin nSize:= StringSize; lpFileNameEx:= StrAlloc(nSize); res:= GetModuleFileNameEx(AProcess, AModule, lpFileNameEx, nSize); if res = 0 then raise Exception.Create(SysErrorMessage(GetLastError)); if res = nSize then result:= _GetModuleFileNameEx(AProcess, AModule, nSize * 2) else result:= lpFileNameEx; StrDispose(lpFileNameEx); end; function GetDLLFilename(DLLHandle: THandle): string; var process: DWORD; h: THandle; me: TModuleEntry32; begin if Win32Platform = VER_PLATFORM_WIN32_NT then // NT4, 2000, XP begin process:= GetCurrentProcess; result:= _GetModuleFileNameEx(process, DLLHandle); end else // Windows 95, 98, Me begin h:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessID); result:= ''; if h = 0 then exit; FillChar(me, 0, SizeOf(me)); me.dwSize:= SizeOf(me); if Module32First(h, me) then repeat if me.hModule = DLLHandle then begin result:= me.szExePath; break; end; until not Module32Next(h, me); CloseHandle(h); end; end;