Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
15-1244210713
evgenij
2009-06-05 18:05
2009.08.09
значение переменных


2-1243594194
DevilDevil
2009-05-29 14:49
2009.08.09
Разные результаты StretchBlt


15-1244195182
test
2009-06-05 13:46
2009.08.09
Отключить всплывающие окна об ошибках.


1-1211900401
viperv
2008-05-27 19:00
2009.08.09
скачать файл из инета


8-1196042949
JJey
2007-11-26 05:09
2009.08.09
Как из Delphi запустить презентацию PowerPoint





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский