![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определить путь к программе зная ее хендл окна [D7, WinXP]
Dmitry_177 © (2007-01-12 22:34:00)Подскажите пожалуйста, как определить путь к программе зная ее хендл окна?
Dmitry_177 (2007-01-13 01:33:00) [1]Almaz, твой пример работает, спасибо )))
Dmitry_177 (2007-01-13 01:30:00) [2]
type
TMaxPathString = array [0..MAX_PATH - 1] of Char;
Dmitry_177 (2007-01-13 01:29:00) [3]Попробовал так.. не работает...(((
function GetFilePath(const WinH: THandle): String;
var
SnapshotH: THandle;
PE32: TProcessEntry32;
PrId: Cardinal;
AppFileName: TMaxPathString;
begin
Result := '';
SnapshotH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapshotH = -1 then Exit;
PE32.dwSize := SizeOf(PE32);
GetWindowThreadProcessID(WinH, PrId);
if Process32First(SnapshotH, PE32) then
repeat
if PE32.th32ProcessID = PrId then begin
Result := String(GetModuleFileName(PE32.th32ProcessID, AppFileName, SizeOf(AppFileName)));
Break;
end;
until not Process32Next(SnapshotH, PE32);
CloseHandle(SnapshotH);
end;
Almaz (2007-01-13 01:21:00) [4]Если не требуется поддержка Win95/98/МЕ, то можно через PSAPI:
function GetModuleFileNameEx(hProcess: THandle; hModule: THandle;
lpFilename: PChar; nSize: Cardinal): Cardinal; stdcall;
external 'Psapi.dll' name 'GetModuleFileNameExA';
function GetEXENameFromWnd(WndHandle: THandle): String;
var
ProcessID: Cardinal;
ProcessHandle: THandle;
Buffer: array [0..MAX_PATH] of Char;
begin
if GetWindowThreadProcessId(WndHandle, ProcessID) = 0 then
RaiseLastOSError;
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ, FALSE, ProcessID);
if ProcessHandle = 0 then
RaiseLastOSError;
try
if GetModuleFileNameEx(ProcessHandle, 0, Buffer, MAX_PATH) = 0 then
RaiseLastOSError;
finally
CloseHandle(ProcessHandle);
end;
Result := Buffer;
end;
Удачи.
kaZaNoVa (2007-01-13 01:18:00) [5]Dmitry_177 (13.01.07 1:15) [6]
PE32.th32ProcessID попробуй ей скормить)))
Dmitry_177 (2007-01-13 01:15:00) [6]читал про GetModuleFileName, но я не пойму как определить хэндл модуля, который используется в первом параметре этой функции.. Вставлял хэндл окна, она ничего не передает в буфер...(((
kaZaNoVa (2007-01-13 01:04:00) [7]
GetModuleFileName
Dmitry_177 (2007-01-13 01:02:00) [8]У меня почему-то определяется только как: "имя.exe". Без пути...((( А мне нужен еще и путь к нему...
kaZaNoVa (2007-01-13 00:56:00) [9]
{uses tlHelp32; }
function GetFilePath(const WinH: THandle): String;
var
SnapshotH: THandle;
PE32: TProcessEntry32;
PrId: Cardinal;
begin
Result := '';
SnapshotH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapshotH = -1 then Exit;
PE32.dwSize := SizeOf(PE32);
GetWindowThreadProcessID(WinH, PrId);
if Process32First(SnapshotH, PE32) then
repeat
if PE32.th32ProcessID = PrId then begin
Result := PE32.szExeFile;
Break;
end;
until not Process32Next(SnapshotH, PE32);
CloseHandle(SnapshotH)
end;
Dmitry_177 (2007-01-13 00:26:00) [10]Понадобилось...
kaZaNoVa (2007-01-12 23:38:00) [11]а зачемм???