我想使用函数 - QueueUserApc(),但它返回0,而GetLastError()返回6 - 无效句柄。只有一个句柄 - 函数QueueUserApc()的第二个参数,但它由OpenThread()返回。那么那里有什么错误??????
部分代码:
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:
答案 0 :(得分:1)
似乎问题是尝试将APC从32位线程排队到64位线程。
文档说:
同样,如果64位进程将APC排队到32位进程,反之亦然,则地址将不正确,目标应用程序将崩溃。
...显然是为了回应七年前this USENET post中描述的错误报告而添加的。那时似乎任何对QueueUserAPC()的调用都会失败ERROR_INVALID_FUNCTION
,但也会使目标线程崩溃。
此问题似乎可以通过明确阻止任何此类尝试并报告ERROR_INVALID_HANDLE
来解决此问题。