Я создал дополнительный поток в некотором маленьком приложении тестирования и хочу приостановить основной поток от этого дополнительного потока. Дополнительный поток создается через CreateRemoteThread
от внешнего процесса.
С тех пор SuspendThread
потребности a HANDLE
к потоку, который должен быть приостановлен, я хочу знать, как получить это HANDLE
из кода, работающего в моем дополнительном потоке.
DWORD GetMainThreadId () {
const std::tr1::shared_ptr<void> hThreadSnapshot(
CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0), CloseHandle);
if (hThreadSnapshot.get() == INVALID_HANDLE_VALUE) {
throw std::runtime_error("GetMainThreadId failed");
}
THREADENTRY32 tEntry;
tEntry.dwSize = sizeof(THREADENTRY32);
DWORD result = 0;
DWORD currentPID = GetCurrentProcessId();
for (BOOL success = Thread32First(hThreadSnapshot.get(), &tEntry);
!result && success && GetLastError() != ERROR_NO_MORE_FILES;
success = Thread32Next(hThreadSnapshot.get(), &tEntry))
{
if (tEntry.th32OwnerProcessID == currentPID) {
result = tEntry.th32ThreadID;
}
}
return result;
}
Не думаю, что есть что-то, что отличало бы главный поток от других после запуска процесса. Однако можно перечислить все потоки в процессе , а с помощью GetThreadTimes найти поток с самым ранним временем создания. Вызовите OpenThread, чтобы получить HANDLE
из идентификатора потока.
Ряд полезных API-функций этого типа находится под (конечно!) Справка по инструментам . API CreateToolhelp32Snapshot()
API сделает снимки выполняющихся потоков для указанного процесса.
// Take a snapshot of all running threads
hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
if( hThreadSnap == INVALID_HANDLE_VALUE )
return( FALSE );
Полный код примера здесь.
Возвращаемая структура не отличает первичный поток от остальных. Механизм этого не известен; в то время как в некоторых версиях исполнения С в конце основного потока будет выполняться ExitProcess(), во всех последних версиях процесс продолжается до выхода последнего потока.
Лучшим вариантом может быть рекомендация Interjay по использованию GetThreadTimes. Если можно CreateProcess()
целевой процесс, то член hThread блока PROCESS_INFORMATION
содержит tid для основного потока. Приветствуйте любые идеи от других.