在 C++ 中使用 RegisterWaitForSingleObject 将参数传递给回调函数

Jus*_*der 0 c++ winapi process callback

我正在尝试制作一个程序,通过给定的进程 ID 检测进程终止。但是我不能给回调函数提供任何参数。我怎样才能做到这一点?谢谢。

void CALLBACK WaitOrTimerCallback(
     _In_  PVOID lpParameter, 
     _In_  BOOLEAN TimerOrWaitFired,
     DWORD processID)   
{   
    MessageBox(0, L"The process has exited.", L"INFO", MB_OK);  
    std::cout << processID << std::endl;  
    return;  
}  

int main()  
{  
    DWORD dwProcessID = 1234;  
    HANDLE hProcHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
    HANDLE hNewHandle;  
    RegisterWaitForSingleObject(&hNewHandle, hProcHandle, WaitOrTimerCallback(?, ?, dwProcessID), NULL, INFINITE, WT_EXECUTEONLYONCE);  
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 6

RegisterWaitForSingleObject()有一个Context参数,正是为了将用户定义的数据传递给回调。例如:

void CALLBACK WaitOrTimerCallback(
     _In_  PVOID lpParameter, 
     _In_  BOOLEAN TimerOrWaitFired)   
{   
    DWORD dwProcessID = reinterpret_cast<DWORD>(lpParameter);
    MessageBox(0, L"The process has exited.", L"INFO", MB_OK);  
    std::cout << dwProcessID << std::endl;  
}  

int main()  
{  
    DWORD dwProcessID = 1234;  
    HANDLE hProcHandle = OpenProcess(SYNCHRONIZE, FALSE, dwProcessID);
    if (hProcHandle)
    {
        HANDLE hNewHandle;  
        if (RegisterWaitForSingleObject(&hNewHandle, hProcHandle, &WaitOrTimerCallback, reinterpret_cast<void*>(dwProcessID), INFINITE, WT_EXECUTEONLYONCE))
            UnregisterWait(hNewHandle);
        CloseHandle(hProcHandle);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然,在这个特殊的例子中,使用RegisterWaitForSingleObject()具有INFINITE超时是矫枉过正的时候WaitForSingleObject()就足够了:

int main()  
{  
    DWORD dwProcessID = 1234;  
    HANDLE hProcHandle = OpenProcess(SYNCHRONIZE, FALSE, dwProcessID);
    if (hProcHandle)
    {
        if (WaitForSingleObject(hProcHandle, INFINITE) == WAIT_OBJECT_0)
        {
            MessageBox(0, L"The process has exited.", L"INFO", MB_OK);  
            std::cout << dwProcessID << std::endl;  
        }
        CloseHandle(hProcHandle);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

RegisterWaitForSingleObject()当您想在后台异步等待对象,同时继续做其他事情时,应该使用它。不要等待等待操作。当对象收到信号时,操作系统会通知您。