RegisterWaitForSingleObject

RegisterWaitForSingleObject

我试图做一个程序,通过给定的进程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);
}

最佳答案

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;
}


但是,在此特定示例中,在RegisterWaitForSingleObject()足够的情况下,将INFINITEWaitForSingleObject()超时一起使用是过大的:

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;
}


当您要在后台继续执行其他操作时要在后台异步等待对象时,应使用RegisterWaitForSingleObject()。不要等待等待操作。发出对象信号时,操作系统将通知您。

关于c++ - 在C++中使用RegisterWaitForSingleObject将参数传递给回调函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54772112/

10-10 13:36