![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать полный путь к файлу зная хендл процесса?
VmDeeP © (2003-07-19 01:32:00)
Как узнать полный путь к файлу зная хендл процесса?
paul_shmakov (2003-07-28 20:35:00) [1]
если только под nt/2k/xp, то можно задействовать функции исключительно kernel32.dll.
схема такая:
1. hProc = OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, false, pid);
2. hThread = CreateRemoteThread(hProc, ... GetProcAddress(GetModuleHandle("kernel32.dll"),"GetCommandLineA") ...);
3. WaitForSingleObject(hThread, INFINITE)
4. GetExitCodeThread(hThread, @addr);
5. CloseHandle(hThread)
6. ReadProcessMemory(hProc, addr, buf, ...)
7. CloseHandle(hProc)
после этого в buf имеем командную строку нужного процесса, в которой и путь к файлу есть.
PVOzerski (2003-07-26 11:58:00) [2]
2VmDeep (23.07.03 01:17)
Сдается мне, в NT4 и более ранних работать не будет.
Игорь (2003-07-26 02:48:00) [3]//dokdok (25.07.03 22:15)
//О! И недавно просмотрел в форуме...
// http://delphibase.endimus.com/?action=viewfunc&topic=sysparams&id=10003
Не это не совсем то
Vmdeep (2003-07-25 23:21:00) [4]
dokdok пробовал я и этот код и др. всеравно путь не тот что должн быть а в моем приере переменная S и есть полный путь! s:=(me32.szExePath);
dokdok (2003-07-25 22:15:00) [5]О! И недавно просмотрел в форуме...
http://delphibase.endimus.com/?action=viewfunc&topic=sysparams&id=10003
dokdok (2003-07-25 21:47:00) [6]
Мне-то интересно определить FileName из PIDа, а про иконки в курсах, похожий код был примерно год назад
Vmdeep (2003-07-25 02:27:00) [7]
Игорь Шевченко © (23.07.03 09:55)VmDeep (23.07.03 01:17)
Приснится же такое...//
Не приснилось а с неба упало!!! :)
dokdok (24.07.03 21:43)Скажу честно, как не крутил кусок, представленный Вова555, сколь не подставлял хендлы окон, но путного не добился ни под ХР,ни под 2000...
Мне кажется не все так просто... Или туповат крестьянин...
//
Нет ты не туповатый крестьянин код действительно не самый....!!!
PS А за pip и браться страшно, хендлы иконок...//
Ну а это ты зря про иконки у любого обьекта в виндах хендл есть так чта.... а pip есть вырезка из моей проги и все работает если есть желание могу выслать мылом!
dokdok (2003-07-24 21:43:00) [8]
Скажу честно, как не крутил кусок, представленный Вова555, сколь не подставлял хендлы окон, но путного не добился ни под ХР,ни под 2000...
Мне кажется не все так просто... Или туповат крестьянин...
PS А за pip и браться страшно, хендлы иконок...
Игорь Шевченко (2003-07-23 09:55:00) [9]
VmDeep (23.07.03 01:17)
Приснится же такое...
VmDeep (2003-07-23 01:17:00) [10]Спасибо большое за советы! Но есть способ лудше! Идет во все виндах и за одно хедл иконки можно получить!
function pip(id:Cardinal; var s:string):THandle ;
var
snap,h : THandle;
me32 : TMODULEENTRY32;
begin
snap := 0;
try
snap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,id);
if snap <> 0 then begin
me32.dwSize := SizeOf(TMODULEENTRY32);
if Module32First(snap, me32) then begin
s:=(me32.szExePath);
h:=ExtractIcon(hInstance,me32.szExePath,0);
if h=0 then h:=LoadImage(0, IDI_WINLOGO, IMAGE_ICON, LR_DEFAULTSIZE,
LR_DEFAULTSIZE, LR_DEFAULTSIZE or LR_DEFAULTCOLOR or LR_SHARED); Result:=h;
while Module32Next(snap, me32) do
( snap)Спасибо большое за советы! Но есть способ лудше! Идет во все виндах и за одно хедл иконки можно получить!
function pip(id:Cardinal; var s:string):THandle ;
var
snap,h : THandle;
me32 : TMODULEENTRY32;
begin
snap := 0;
try
snap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,id);
if snap <> 0 then begin
me32.dwSize := SizeOf(TMODULEENTRY32);
if Module32First(snap, me32) then begin
s:=(me32.szExePath);
h:=ExtractIcon(hInstance,me32.szExePath,0);
if h=0 then h:=LoadImage(0, IDI_WINLOGO, IMAGE_ICON, LR_DEFAULTSIZE,
LR_DEFAULTSIZE, LR_DEFAULTSIZE or LR_DEFAULTCOLOR or LR_SHARED); Result:=h;
while Module32Next(snap, me32) do
end;
end;
finally
CloseHandle(snap);
end;
end;
Вова555 (2003-07-22 17:20:00) [11]function GetAppFileName (hWnd: THandle) :string;
var dPID: dWord;
hHandle: THandle;
begin
GetWindowThreadProcessId(hWnd, @dPID);
SetLength (Result, MAX_PATH);
hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, dPID);
if GetModuleFileNameEx(hHandle,0,PChar(Result),MAX_PATH) > 0
( Result, StrLen (PChar (Result)function GetAppFileName (hWnd: THandle) :string;
var dPID: dWord;
hHandle: THandle;
begin
GetWindowThreadProcessId(hWnd, @dPID);
SetLength (Result, MAX_PATH);
hHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, True, dPID);
if GetModuleFileNameEx(hHandle,0,PChar(Result),MAX_PATH) > 0
then SetLength (Result, StrLen (PChar (Result)));
end; //для имени exe... GetModuleFileNameEx для XP-точно пашет.. для 9x - такая GetModuleFileName
Игорь Шевченко (2003-07-22 12:30:00) [12]
Крот © (22.07.03 05:46)
Нет, это разные вещи
Крот (2003-07-22 05:46:00) [13]
Э-э-э, простите, может я чего не так понял, хендл процесса - это HINSTANCE? Тогда, может просто GetModuleFileName?
Игорь Шевченко (2003-07-21 13:41:00) [14]
Для NT/Win2K/WinXP - например, через PEB или через NtQueryInformationProcess, если есть Handle процесса.