Главная страница
    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.005 c
15-1244233802
Юрий
2009-06-06 00:30
2009.08.09
С днем рождения ! 6 июня 2009 суббота


15-1244613139
Василий Иванов_22
2009-06-10 09:52
2009.08.09
уравнение


15-1244481707
Gydvin
2009-06-08 21:21
2009.08.09
глюки при умножении


2-1245049095
DDR2
2009-06-15 10:58
2009.08.09
Найти все ссылки


2-1243105083
AntonioPermskiy
2009-05-23 22:58
2009.08.09
TListView vsList





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