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
begin
process:= GetCurrentProcess;
result:= _GetModuleFileNameEx(process, DLLHandle);
end
else
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;
|