Форум: "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