我会使用函数-- QueueUserApc(),但是它返回0,而GetLastError()返回6-无效的handle.There只是一个句柄--函数QueueUserApc()的第二个参数,但是它是由OpenThread().so返回的--那里有什么问题?
守则的一部分:
void WINAPI My_IDtoHandle(IN PDWORD IDArray,
IN DWORD dwNumber,
OUT PHANDLE * Thread_Handle_Array)
{
PHANDLE handlearray;
DWORD count = 0;
handlearray = (PHANDLE)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
dwNumber*sizeof(HANDLE));
for (; count < dwNumber; count++)
{
handlearray[count] = OpenThread(THREAD_ALL_ACCESS,
FALSE,
IDArray[count]);
if (handlearray[count] == NULL)
printf("Open the thread-%d is failed!\n\n", IDArray[count]);
}
*Thread_Handle_Array = handlearray;
return;
}调用上面的函数:
result = QueueUserAPC((PAPCFUNC)SetEvent,
Thread_Handle_Array[count],
(ULONG_PTR)(Target_Event_Handle_Array + count));
if (result == 0)
{
printf("The inserting of the %dth function-SetEvent is failed!\n\n", count + 1);
printf("The error code is %d\n\n", GetLastError());
}返回的OpenThread句柄是strang:

发布于 2017-01-27 23:02:01
问题似乎是试图将APC从32位线程排队到64位线程。
文件上说:
同样,如果64位进程将APC排队到32位进程,反之亦然,地址将不正确,目标应用程序将崩溃。
..。这显然是针对七年前在这个USENET哨所中描述的一个bug报告而添加的。当时,对QueueUserAPC()的任何此类调用似乎都会在ERROR_INVALID_FUNCTION中失败,但也会使目标线程崩溃。
这个问题可能是后来通过显式阻止任何这样的尝试和报告ERROR_INVALID_HANDLE来解决的。
https://stackoverflow.com/questions/41866584
复制相似问题