API:HANDLE GetCurrentThreadId(void)在线程内调用有效。
线程外请参考API BOOL DuplicateHandle(一大堆参数:)
线程外请参考API BOOL DuplicateHandle(一大堆参数:)
解决方案 »
- 谁有VC++的vs6sp5 ,请分享一下,谢谢。
- 静态函数调用非静态函数问题?(AfxBeginThread)
- TFTP协议数据包大小可以更改么?
- 怎样把char型数据存入SQLServer数据库
- 求助:socket notification sink 错误
- 有偿合作曲线字体生成算法
- 使用multimap时出现的问题,请赐教!
- 用IHTMLDocument2::execCommand的saveas将一个html文件保存为txt执行,为什么不行?
- 一般的windows程序,开多少个线程为宜?
- SDK问题?这种代码也有人写!qie,请SDK高手捉虫!我想可能是利用CreateWindow为现有窗体创建一个子窗体,一踏糊涂!
- 我原来用Delphi做数据库,现在改用VC++6 && SQL 了,感觉很好,没什么麻烦的,比Delphi好多了,大家快改用VC做数据库吧
- 有c基础,vc学习一个月,要用vc做毕业设计
DuplicateHandle也不用你介绍,你无法在人家的线程里调用GetCurrentThread
事实上,你可以用ntdll里的NtOpenThread来获得县城句柄。其声明如下:
DWORD WINAPI NtOpenThread(HANDLE* phThread, // [out]
DWORD, // [in], dwDesiredAccess
VOID*, // [in], OPEN_PROCESS_THREAD struct
VOID* // [in], CLIENT_ID struct
);typedef struct _OPEN_PROCESS_THREAD {
DWORD cbSize; // = 0x18
DWORD dwReserved01;
DWORD dwReserved02;
BOOL bInheritHandle;
DWORD dwReserved03;
DWORD dwReserved04;
}OPEN_PROCESS_THREAD, *POPEN_PROCESS_THREAD;typedef struct _CLIENT_ID
{
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID, *PCLIENT_ID;HANDLE OpenThread( DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD threadId,
DWORD processId )
{
OPEN_PROCESS_THREAD ot = {0};
CLIENT_ID id = {0};
HANDLE hThread = NULL; ot.cbSize = sizeof( ot );
ot.bInheritHandle = (bInheritHandle!=0) ? 1 : 0;
id.UniqueProcess = (HANDLE)processId;
id.UniqueThread = (HANDLE)threadId; DWORD error = NtOpenThread( &hThread, dwDesiredAccess, &ot, &id );
return hThread;
}
实际上,NtOpenThread的调用参数和NtOpenProcess的完全一样,你也可以用这个方法直接调用NtOpenProcess。
能否告知这些资料是从何处获得?我的MSDN中可没有NTOpenThread的帮助。
我现在用的是Windows2000,我还想知道如何使写出来的代码在Window9x中也能运行(哪里没有ntdll吧,这一次加50分)
windows9x下你可以自己试试。Matt在"Windows95 System programming Secrets"一书里说thread id和一个常数(每次开机不同)XOR后可以得到tdb(thread database)。你可以看看他的书。