Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение пути к процессу В WINDOWS ХР. [D6, Win95/98, WinXP]


Clipper ©   (2003-06-06 15:24:00) 

Как все-таки получить путь(В ХР), зная имя процесса.
Используя нижеприведенный код в 98 показывает путь и имя к модулю,
а в ХР только имя загруженного модуля(ехешники) без пути.
Почему так?
*********************код**************************
uses TlHelp32;

procedure TForm1.Button2Click(Sender: TObject);
var
handler:thandle;
data:TProcessEntry32;

function return_name:string;
var
i:byte;
names:string;
begin
i:=0;
while data.szExeFile[i] <> "" do
begin
names:=names+data.szExeFile[i];
inc(i);
end;
result:=names;
end;

begin
handler:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);
if process32first(handler,data) then
begin
listbox1.Items.add(return_name);
while process32next(handler,data) do listbox1.Items.add(return_name);
end;
end;
*******************************************************

Если же использовать этот код с GetModuleFileName и GetModuleHandle,
то везде выдается путь к ехешнику моей программы.
************************************************
procedure TForm1.Button1Click(Sender: TObject);
var
handler:thandle;
data:TProcessEntry32;

function GetPathPro(hInst:THandle):string;
var
Path: array [0..MAX_PATH] of char;
nLen: integer;
begin
GetModuleFileName(hInst, Path, MAX_PATH);
nLen:=lstrlen(Path);
while (nLen>0) and (Path[nLen]<>"\") do dec(nLen);
Path[nLen+1]:=#0;
result:=Path;
end;

function return_name:string;
var
i:byte;
names:string;
begin
i:=0;
while data.szExeFile[i]<>"" do
begin
names:=names+data.szExeFile[i];
inc(i);
end;
result:=names;
end;

begin
handler:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);
if process32first(handler,data) then
begin
listbox1.Items.add(GetPathPro(GetModuleHandle(pchar(return_name))));
while process32next(handler,data) do
listbox1.Items.add(GetPathPro(GetModuleHandle(pchar(return_name))));
end;
end;
*************************************************************
Подскажите что я сделал не так и как работает у вас.


Clipper   (2003-06-08 12:36:00) [1]

Получилось. Спасибо всем. Правильно надо было GetModuleFileNameEx(OpenProcess(PROCESS_VM_READ or PROCESS_QUERY_INFORMATION, False, data.th32ProcessID), 0,path, MAX_PATH). Тема закрыта :)


VMcL   (2003-06-08 03:32:00) [2]

>Clipper (07.06.03 17:16)

PROCESS_VM_READ or PROCESS_QUERY_INFORMATION


NightAngel   (2003-06-07 20:18:00) [3]

> Clipper (07.06.03 17:16)

Посмотрите этот пример, правда он на С, но ничего сложного там нет. Может поможет. По крайней мере, под NT у меня это точно работает.


#define MAXPCOUNT 40960
DWORD PIDs[MAXPCOUNT];
DWORD PNeededCount=0;
EnumProcesses(PIDs,sizeof PIDs),&PNeededCount);
for ( int i=0;i


R4D][   (2003-06-07 18:44:00) [4]

А почему во втором параметре 0? Надо найти HInstance нужного вам модуля. Зная hwnd, можно найти так - GetWindowLong(hwnd,GWL_HINSTANCE)...


Clipper   (2003-06-07 17:16:00) [5]

>R4D][
Пробовал, не выходит.
GetModuleFileNameEx(OpenProcess(PROCESS_VM_READ, False, data.th32ProcessID), 0,path, MAX_PATH);
Может покажете как у вас так получается.


R4D][   (2003-06-07 15:50:00) [6]

Вместо GetModuleFileName используй GetModuleFileNameEx, не забудь подключить psapi


Clipper   (2003-06-07 15:12:00) [7]

>Ученик
data.dwSize := SizeOf(data); в 9х это точно.
А в ХР кто-нибудь пробовал решить этот вопрос.
GetModuleHandle и GetModuleFileName для ехешников видимо не подходит(только dll).


Ученик   (2003-06-07 08:36:00) [8]

>Clipper (06.06.03 15:24)
data.dwSize := SizeOf(data);


Clipper   (2003-06-06 23:00:00) [9]

Нашел как получить handle другого процесса - вроде то самое.
Но теперь обнаружил что GetModuleFileName возвращает 0 (getlasterror = 0(A call to an OS function failed) иногда 5(access denided)). т.е. GetModuleFileName не выполняется корректно.
Еще наткнулся в одном форуме на то что GetModuleFileName
работает только в 9х. Похоже на правду, у меня в ХР data.szExeFile выдает только имя самого ехешника, а в 9х в data.szExeFile путь с именем!


NightAngel   (2003-06-06 21:24:00) [10]

>Clipper
Т.е. получается что GetModuleHandle возвращает указатель только на модули которые отображаются в адресном пространстве текущего процесса(моей проги).


Всё верно т.к. фактически GetModuleHandle() возвращает image base загруженного модуля (т.е. иными словами смещение от начала сегмента, в который загружен Ваш процесс), в ином случае функции пришлось-бы возвращать селектор дескриптора сегмента чужого процесса, но смысла в этом нет, т.к. код Вашего процесса не может использовать привилегированные инструкции исполняясь в Ring3. Для этих целей существуют соответствующие API функции.

> КТО-НИБУДЬ ОТВЕТИТ ВСЕ-ТАКИ КАК ЕЩЕ МОЖНО УЗНАТЬ ПУТЬ К ЗАПУЩЕННОМУ ПРОЦЕССУ
Под NT удобно пользоваться PSAPI: EnumProcesses, EnumProcessModules и потом GetModuleFileName. Наверное это будет работать и под XP.

Удачи!


Clipper   (2003-06-06 20:17:00) [11]

Нет меня интересуют пути всех запущенных процессов(прог).


Spawn   (2003-06-06 19:59:00) [12]

Если тебя интересует только своя прога в Дельфи, то Application.ExeName


Clipper   (2003-06-06 18:45:00) [13]

Еще нашел вот это: The GetModuleHandle function returns a module handle for the specified module if the file has been mapped into the address space of the calling process.
Т.е. получается что GetModuleHandle возвращает указатель только
на модули которые отображаются в адресном пространстве текущего процесса(моей проги). Как мне извесно ехе так не отображаются.
Теперь вопрос в том как получить указатель на другой процесс.
Или КТО-НИБУДЬ ОТВЕТИТ ВСЕ-ТАКИ КАК ЕЩЕ МОЖНО УЗНАТЬ ПУТЬ К ЗАПУЩЕННОМУ ПРОЦЕССУ(В ХР).


Clipper   (2003-06-06 18:25:00) [14]

Сейчас обнаружил что GetModuleHandle возвращает 0.
Почему так кто-нибудь ответит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо