Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];

Вниз

Получение пути к процессу В WINDOWS ХР.   Найти похожие ветки 

 
Clipper   (2003-06-06 15:24) [0]

Как все-таки получить путь(В ХР), зная имя процесса.
Используя нижеприведенный код в 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-06 18:25) [1]

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


 
Clipper   (2003-06-06 18:45) [2]

Еще нашел вот это: 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 возвращает указатель только
на модули которые отображаются в адресном пространстве текущего процесса(моей проги). Как мне извесно ехе так не отображаются.
Теперь вопрос в том как получить указатель на другой процесс.
Или КТО-НИБУДЬ ОТВЕТИТ ВСЕ-ТАКИ КАК ЕЩЕ МОЖНО УЗНАТЬ ПУТЬ К ЗАПУЩЕННОМУ ПРОЦЕССУ(В ХР).


 
Spawn   (2003-06-06 19:59) [3]

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


 
Clipper   (2003-06-06 20:17) [4]

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


 
NightAngel   (2003-06-06 21:24) [5]

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


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

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

Удачи!


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

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


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

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


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

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


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

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


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

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


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

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


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

> 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<PNeededCount/sizeof(DWORD);i++ )
{
HANDLE PHandle=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,0,PIDs[i]);
if ( PHandle )
{
#define MAXMCOUNT 40960
HMODULE Modules[MAXMCOUNT];
DWORD MNeededCount;
if ( EnumProcessModules(PHandle,Modules,sizeof(Modules),&MNeededCount) )
{
for ( int j=0;j<PNeededCount/sizeof(HMODULE);j++ )
{
#define MAXSTRLEN 40960
char Str[MAXSTRLEN];
if ( GetModuleFileName(PHandle,Modules[j],Str,MAXSTRLEN) )
{
// получили имя модуля
}
}
}
CloseHandle(PHandle);
}
}



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

>Clipper (07.06.03 17:16)

PROCESS_VM_READ or PROCESS_QUERY_INFORMATION


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

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.08.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
1-20537
Goga
2003-07-26 17:09
2003.08.07
Ошибка Abstract Error


14-20666
Rouse_
2003-07-21 01:41
2003.08.07
Мастера улыбаются - 4


14-20685
Andryk
2003-07-23 10:00
2003.08.07
Просто прикол :о))


1-20470
Larisa
2003-07-25 08:16
2003.08.07
Подскажите, пожалуйста, как определить из приложения, что


1-20612
Opera
2003-07-24 13:46
2003.08.07
ini





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский