Главная страница
    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.009 c
2-1245012972
HRustBB
2009-06-15 00:56
2009.08.09
Сохранить текстовый файл в UTF-8


15-1244542530
Машинка
2009-06-09 14:15
2009.08.09
Блок питания 16-10v


15-1244493792
Медвежонок Пятачок
2009-06-09 00:43
2009.08.09
новая мулька


2-1244714758
Ivba
2009-06-11 14:05
2009.08.09
TCobmoBox без DropDown


15-1244082212
alert2006
2009-06-04 06:23
2009.08.09
Помогите решить задачу





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