gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:35:29 35 4
gpt4 key购买 nike

我正在尝试制作一个程序,通过给定的进程 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;
}

尽管如此,在这个特定示例中,当 WaitForSingleObject() 就足够时,使用 RegisterWaitForSingleObject()INFINITE 超时是过度的:

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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com