这个函数在Windows Server 2003之前的平台上是没有的,而我在写类库的时候偏偏需要这个功能,无奈的参考了MSDN和网络上的各种代码,勉强写出了一个能够使用的 GetThreadId。代码我就在这里贴一下吧。也可以到我的Google Code去下载。GetThreadId.7z
#include <windows.h>
#include <thlhelp32.h>
DWORD GetThreadID(HANDLE hThread,DWORD dwProcessId){
HANDLE hThreadSnap=INVALID_HANDLE_VALUE;
THREADENTRY32 te32;
#ifdef __GNUC__ //如果是MinGW的话,OpenThread这个函数在windows.h里是没有的,需要动态加载
typedef HANDLE (*OPENTHREAD)(DWORD,BOOL,DWORD);
OPENTHREAD OpenThread=::GetProcAddress(::GetModuleHandle("kernel32.dll"),"OpenThread");
#endif
hThreadSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);//获取进程列表快照
if(hThreadSnap==INVALID_HANDLE_VALUE){
return -1;
}
te32.dwSize = sizeof(THREADENTRY32); //计算THREADENTRY32结构体的大小
if(::Thread32First(hThreadSnap,&te32)==FALSE){
return 1;
}
while(::Thread32Next(hThreadSnap,&te32)!=FALSE){//如果获取下一个线程成功
if(te32.th32OwnerProcessID==dwProcessId){//如果获取的进程ID与指定的进程ID相同
HANDLE hTempThread=OpenThread(THREAD_ALL_ACCESS,FALSE,te32.th32ThreadID);//根据结构体内的线程ID,打开线程得到句柄
if(hTempThread==hThread){//如果指定线程句柄与打开句柄相同
::CloseHandle(hTempThread);
::CloseHandle(hThreadSnap);
return te32.th32ThreadID;//返回句柄
}else{
::CloseHandle(hTempThread);
}
}
}
return 0;
}