[英]QueueUserAPC access violation on x86
我正在嘗試使用QueueUserAPC
在特定線程上異步運行某些功能。 當針對x64進行編譯時,我的代碼可以正常工作,但是針對x86進行編譯和運行時,出現訪問沖突。
在我的文章結尾處,有一個最小的完整示例,顯示了我要執行的操作(為簡潔起見,省略了線程和事件的清理)。
在我的機器上,當我為“ x64”編譯並運行時,我得到了預期的輸出:
等候...
異步功能!
等候...
異步功能!
等候...
ConsoleApplication3.exe(進程17100)以代碼0退出。
當我為“ x86”編譯並運行時,我得到:
等候...
異步功能!
然后是訪問沖突,在這里:
if (WaitForSingleObjectEx(param, INFINITE, TRUE) == WAIT_OBJECT_0)
在ConsoleApplication3.exe中的0x776227FB(ntdll.dll)處引發異常:0xC0000005:訪問沖突讀取位置0x36623194。
我究竟做錯了什么?
完整示例:
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
DWORD ThreadFunction(LPVOID param)
{
while (true)
{
printf("waiting...\n");
if (WaitForSingleObjectEx(param, INFINITE, TRUE) == WAIT_OBJECT_0)
break;
}
ExitThread(0);
return 0;
}
void AsyncFunction(UINT_PTR param)
{
printf("async function!\n");
}
int main()
{
HANDLE hThread, hStopEvent;
DWORD threadID;
hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunction, hStopEvent, 0, &threadID);
Sleep(1000);
QueueUserAPC((PAPCFUNC) AsyncFunction, hThread, NULL);
Sleep(1000);
QueueUserAPC((PAPCFUNC) AsyncFunction, hThread, NULL);
Sleep(1000);
SetEvent(hStopEvent);
WaitForSingleObject(hThread, INFINITE);
}
我的AsyncFunction
定義有兩個錯誤:
1-參數類型應為ULONG_PTR
, 而不是 UINT_PTR
。 這實際上是我實際實施中的復制粘貼錯誤
2-函數缺少調用約定
void AsyncFunction(UINT_PTR param)
應該為void CALLBACK AsyncFunction(ULONG_PTR param)
然后,無需在此處PAPCFUNC
為PAPCFUNC
:
QueueUserAPC((PAPCFUNC) AsyncFunction, hThread, NULL);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.