Форум: "WinAPI";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
ВнизПолучение 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.08.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c