我有这个代码贯穿所有线程。我想从我自己的进程中获取线程,而不必遍历系统上运行的所有线程。
var
SnapProcHandle: THandle;
NextProc : Boolean;
TThreadEntry : TThreadEntry32;
begin
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
Result := (SnapProcHandle <> INVALID_HANDLE_VALUE);
if Result then
try
TThreadEntry.dwSize := SizeOf(TThreadEntry);
NextProc := Thread32First(SnapProcHandle, TThreadEntry);
while NextProc do
begin
if TThreadEntry.th32OwnerProcessID = PID then
begin
Memo1.Lines.Add('Thread ID '+IntToStr(TThreadEntry.th32ThreadID));
Memo1.Lines.Add('base priority '+inttostr(TThreadEntry.tpBasePri));
Memo1.Lines.Add('delta priority '+inttostr(TThreadEntry.tpBasePri));
end;
NextProc := Thread32Next(SnapProcHandle, TThreadEntry);
end;
finally
CloseHandle(SnapProcHandle);
end;
end;
答案 0 :(得分:2)
您已经知道如何过滤特定进程的线程,因为代码已经完全按照以下方式执行:
if TThreadEntry.th32OwnerProcessID = PID then
您需要的只是调用过程的PID
。使用GetCurrentProcessId()
获取该值。
不幸的是,CreateToolhelp32Snapshot()
不允许您在使用TH32CS_SNAPTHREAD
时将快照限制为特定进程,快照包含系统中的所有线程,因此您需要在各自的PID上过滤它们你循环通过它们。
答案 1 :(得分:0)
您可以使用WMI(Windows MIcrosoft Instrumentation)执行此操作。 Here there are an article解释了如何检索一个进程运行的所有线程。这篇文章是西班牙语,但你可以使用authomatic翻译o查看代码并下载样本。
使用WMI,您可以使用班级Win32_Process class获取流程的所有信息。 您可以尝试在控制台中执行这样的类似命令,以获取此类的信息。
WMIC流程,其中name =&#34; bds.exe&#34;获取名称,描述,ProcessId, ThreadCount,Handle
通过这个,你可以获得过程的信息。
第二步如果&#34;如何检索与进程关联的线程&#34;。您可以使用Win32_Thread class。
执行此操作如果你启动这样的查询:
SELECT * FROM WIN32_THREAD WHERE ProcessHandle = 10740
您将获得进程10740的所有线程(请参阅第一个查询的ProcessId)。
问候。