句柄OpenThread()已返回,QueueUserApc()认为它无效

时间:2017-01-26 03:45:06

标签: c++ c windows

我想使用函数 - 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:

enter image description here

1 个答案:

答案 0 :(得分:1)

似乎问题是尝试将APC从32位线程排队到64位线程。

文档说:

  

同样,如果64位进程将APC排队到32位进程,反之亦然,则地址将不正确,目标应用程序将崩溃。

...显然是为了回应七年前this USENET post中描述的错误报告而添加的。那时似乎任何对QueueUserAPC()的调用都会失败ERROR_INVALID_FUNCTION,但也会使目标线程崩溃。

此问题似乎可以通过明确阻止任何此类尝试并报告ERROR_INVALID_HANDLE来解决此问题。