Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.09;
Скачать: CL | DM;

Вниз

Получение ID главного потока приложения   Найти похожие ветки 

 
JetuS   (2008-06-17 17:42) [0]

Нужно определить ThreadID приложения по его ProcessID (PID).
Как это можно сделать?


 
clickmaker ©   (2008-06-17 18:44) [1]

а зачем? и откуда PID взят?


 
jetus   (2008-06-17 22:41) [2]


> а зачем? и откуда PID взят?

PID взят из снимка системы CreateToolhelp32Snapshot.
А ID потока надо, чтобы сделать ему Suspend.


 
Riply ©   (2008-06-17 23:18) [3]

> [2] jetus   (17.06.08 22:41)
> PID взят из снимка системы CreateToolhelp32Snapshot.

Дык, а почему оттуда же не взять и ID потоков ?
CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, ...)

P.S.
Если уж усыплять, то всех :)


 
JetuS   (2008-06-18 09:34) [4]


> Дык, а почему оттуда же не взять и ID потоков ?CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,
>  ...)P.S.Если уж усыплять, то всех :)

Это именно то что нужно, большое спасибо.
Но... не работает :)

Вот код:
// Получение ProcessID процесса по имени
function GetPID(aExeName: String): DWORD;
var
 hSnap: Cardinal;
 ProcessEntry: TProcessEntry32;
 Finding: LongBool;
begin
 Result := 0;
 aExeName := AnsiLowerCase(aExeName);
 hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if hSnap = 0 then
   Exit;
 ProcessEntry.dwSize := SizeOf(ProcessEntry);
 Finding := Process32First(hSnap, ProcessEntry);
 while Finding do
 begin
   if aExeName = AnsiLowerCase(ExtractFileName(ProcessEntry.szExeFile)) then
   begin
     Result := ProcessEntry.th32ProcessID;
     Break;
   end;
   Finding := Process32Next(hSnap,ProcessEntry);
 end;
 CloseHandle(hSnap);
end;

// Получение массива ID-шек потоков процесса по его PID
function GetThreads(aPID: DWORD): TThreadsArray;
var
 hSnap: Cardinal;
 ThreadEntry: TThreadEntry32;
 Finding: LongBool;
 aThreads: TThreadsArray;
begin
 SetLength(aThreads, 0);
 hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, 0);
 if hSnap = 0 then
   Exit;
 ThreadEntry.dwSize := SizeOf(ThreadEntry);
 Finding := Thread32First(hSnap, ThreadEntry);
 while Finding do
 begin
   if aPID = ThreadEntry.th32OwnerProcessID then
   begin
     SetLength(aThreads, Length(aThreads)+1);
     aThreads[Length(aThreads)-1] := ThreadEntry.th32ThreadID;
   end;
   Finding := Thread32Next(hSnap, ThreadEntry);
 end;
 CloseHandle(hSnap);
 SetLength(Result, Length(aThreads));
 Result := aThreads;
end;

// Пробуем...
procedure TForm1.Button1Click(Sender: TObject);
var
 PID: DWORD;
 ThreadsID: TThreadsArray;
 i: Integer;
begin
 PID := GetPID("calc.exe"); // PID вытягивается нормально (проверяю через TaskManager)
 ThreadsID := GetThreads(PID); // Массив заполняется
 for i := 0 to Length(ThreadsID)-1 do
   SuspendThread(ThreadsID[i]); // А вот тут не работает :(
end;


Не останавливает потоки и всё...
Что не так?


 
JetuS   (2008-06-18 09:37) [5]

А! Забыл описание выложить:
type
 TThreadsArray = array of DWORD;


 
Rouse_ ©   (2008-06-18 10:18) [6]

 function OpenThread(dwDesiredAccess: DWORD;
   bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall;
   external kernel32;

const
 THREAD_ALL_ACCESS = $000F0000 or $00100000 or $3FF;

...

   PID := GetPID("calc.exe"); // PID вытягивается нормально (проверяю через TaskManager)
   ThreadsID := GetThreads(PID); // Массив заполняется
   for I := 0 to Length(ThreadsID) - 1 do
     SuspendThread(OpenThread(THREAD_ALL_ACCESS, False, ThreadsID[i]));


 
Leonid Troyanovsky ©   (2008-06-18 12:59) [7]


> Riply ©   (17.06.08 23:18) [3]

> Если уж усыплять, то всех :)

NtSuspendProcess - 2003, XP

--
Regards, LVT.


 
JetuS   (2008-06-18 16:58) [8]

tnx 2 All!
Всё работает :)


 
Rouse_ ©   (2008-06-18 16:59) [9]

Если работает, то не забывай хэндл открытый OpenThread-ом закрывать :)


 
Riply ©   (2008-06-18 17:33) [10]

> [7] Leonid Troyanovsky ©   (18.06.08 12:59)
> NtSuspendProcess - 2003, XP

Если мне не изменяет память, то под XP SP2, не было возможности
использовать эту функцию.
Я ошибаюсь ?

> [9] Rouse_ ©   (18.06.08 16:59)

С возвращением :)

> Если работает, то не забывай хэндл открытый OpenThread-ом закрывать :)

Дык ты сам, в своем примере, накорню пресек возможность закрыть Handle :)


 
Rouse_ ©   (2008-06-18 18:01) [11]


> С возвращением :)

Пасиб :)


> Дык ты сам, в своем примере, накорню пресек возможность
> закрыть Handle :)

А мне лень расписывать было :)


 
Leonid Troyanovsky ©   (2008-06-18 18:15) [12]


> Riply ©   (18.06.08 17:33) [10]

> Я ошибаюсь ?

Поищи в ntdll.dll
tdump.exe
0000E83A  344 0150 NtSuspendProcess

--
Regards, LVT.


 
Riply ©   (2008-06-18 19:54) [13]

> [12] Leonid Troyanovsky ©   (18.06.08 18:15)
> Поищи в ntdll.dll

Она не только там сидит, но еще и корректно работает негодяйка :)
Спасибо.

P.S.
Уж и не помню откуда я сделала вывод, что ее нельзя использовать под XP :(



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

Текущий архив: 2009.08.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.025 c
1-1211807227
9899100
2008-05-26 17:07
2009.08.09
помогите найти ошибку


2-1244445645
Демон
2009-06-08 11:20
2009.08.09
Build with runtime packages


15-1244547469
ТИМА
2009-06-09 15:37
2009.08.09
Неполные уравнения


6-1205575291
kail
2008-03-15 13:01
2009.08.09
Загрузка файлов на сервер


3-1225445959
dmitry_12_08_73
2008-10-31 12:39
2009.08.09
Сохранение курсоров в TDBGrid