如何使用 setevent 停止进程处理程序
How to use setevent to stop process handler
我正在尝试 createProcess
然后将进程句柄继承到事件句柄
HANDLE app_event;
TCHAR* path = L"C:\My.exe";
STARTUPINFO info;
PROCESS_INFORMATION processInfo;
ZeroMemory(&info, sizeof(info));
info.cb = sizeof(info);
ZeroMemory(&processInfo, sizeof(processInfo));
CreateProcess(path, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo);
ThreadId = processInfo.dwThreadId;
app_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
DuplicateHandle(GetCurrentProcess(), processInfo.hProcess,
GetCurrentProcess(),
&app_event,
0, FALSE,
DUPLICATE_SAME_ACCESS);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
我正在为事件创建线程
但是当我调用 setEvent
停止进程时
进程没有停止,我卡在了 WaitForSingleObject
SetEvent(app_event);
WaitForSingleObject(app_thread, INFINITE);
我是不是做错了什么?
抱歉,我是 C++ 新手。
DuplicateHandle
并不像您想象的那样。它为现有对象创建一个新句柄。您似乎认为它可以用来将一种类型的对象变成另一种类型的对象。这不可以。进程句柄不能成为事件句柄。
这种误解因您的代码缺乏错误检查而变得更加复杂。 Win32 API 不会引发异常。错误通过 API 函数 return 值发出信号。不幸的是,您忽略了这一点。
您似乎在尝试以合作方式终止进程。发出事件信号以指示需要终止。然后等待进程停止。这只有在其他进程合作时才有效。没有迹象表明你是这种情况。您当然不能将终止事件注入其他进程。
如果其他进程没有记录终止信号的方式,那么您最好的办法就是调用 TerminateProcess
。如果您控制其他进程,那么您可以就终止的合作程序达成一致。使用两个进程都可以访问的命名事件。
我想再重复一次我的主要建议。调用 Win32 函数时始终检查错误。没有一种方法可以做到这一点,您必须仔细阅读您调用的每个函数的文档。
我正在尝试 createProcess
然后将进程句柄继承到事件句柄
HANDLE app_event;
TCHAR* path = L"C:\My.exe";
STARTUPINFO info;
PROCESS_INFORMATION processInfo;
ZeroMemory(&info, sizeof(info));
info.cb = sizeof(info);
ZeroMemory(&processInfo, sizeof(processInfo));
CreateProcess(path, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo);
ThreadId = processInfo.dwThreadId;
app_event = CreateEventW(nullptr, TRUE, FALSE, nullptr);
DuplicateHandle(GetCurrentProcess(), processInfo.hProcess,
GetCurrentProcess(),
&app_event,
0, FALSE,
DUPLICATE_SAME_ACCESS);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
我正在为事件创建线程
但是当我调用 setEvent
停止进程时
进程没有停止,我卡在了 WaitForSingleObject
SetEvent(app_event);
WaitForSingleObject(app_thread, INFINITE);
我是不是做错了什么?
抱歉,我是 C++ 新手。
DuplicateHandle
并不像您想象的那样。它为现有对象创建一个新句柄。您似乎认为它可以用来将一种类型的对象变成另一种类型的对象。这不可以。进程句柄不能成为事件句柄。
这种误解因您的代码缺乏错误检查而变得更加复杂。 Win32 API 不会引发异常。错误通过 API 函数 return 值发出信号。不幸的是,您忽略了这一点。
您似乎在尝试以合作方式终止进程。发出事件信号以指示需要终止。然后等待进程停止。这只有在其他进程合作时才有效。没有迹象表明你是这种情况。您当然不能将终止事件注入其他进程。
如果其他进程没有记录终止信号的方式,那么您最好的办法就是调用 TerminateProcess
。如果您控制其他进程,那么您可以就终止的合作程序达成一致。使用两个进程都可以访问的命名事件。
我想再重复一次我的主要建议。调用 Win32 函数时始终检查错误。没有一种方法可以做到这一点,您必须仔细阅读您调用的每个函数的文档。