我正在尝试将一些代码移植到64位,但似乎_beginthreadex
中的地址标识符是unsigned int
,这是32位而我无法从函数中传递/接收64位地址标识符:
uintptr_t _beginthreadex( // NATIVE CODE
void *security,
unsigned stack_size,
unsigned ( __stdcall *start_address )( void * ),
void *arglist,
unsigned initflag,
unsigned *thrdaddr // <-- 32-bit address
);
我检查了MSDN documentation,但我没有看到64位版本的功能。我是否包含错误的标头,每处理器标志或是否有其他方法来创建具有64位地址标识符的线程?
文档指出thrdaddr
参数是32位:
Thrdaddr
Points to a 32-bit variable that receives the thread identifier. Might be NULL, in which case it is not used.
答案 0 :(得分:5)
thrdaddr
参数接收线程ID。它不是线程函数的地址。它似乎是一个非常糟糕的参数。
start_address
参数是线程函数指针,您可以在该参数中传递64位函数指针。
您对问题的更新表明您认为64位Windows上的线程ID是64位值。这是一种误解。所有Windows版本的线程ID都是32位值。
答案 1 :(得分:1)
Thrdaddr
指向接收线程标识符的32位变量。可能为NULL,在这种情况下不使用它。
换句话说,thrdaddr
获取线程ID。它不是该主题的地址。
在64位中,所有指针都是64位。所以这才有用。
答案 2 :(得分:1)
你得到了一些混淆的论点。线程proc的地址将作为start_address
传递。 thrdaddr
是一个可选参数,而不是接收线程ID。
HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex(
NULL,
0,
&YourThreadProc, // this is your thread procedure
NULL,
0,
&threadID); // threadID will hold the ID of the new thread