Winapi 如何使用setevent停止进程处理程序

Winapi 如何使用setevent停止进程处理程序,winapi,Winapi,我试图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)); Create

我试图
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++新手。<> >代码>复制句柄< /代码>不能按你的想法去做。它为现有对象创建一个新句柄。您似乎认为它可以用来将一种类型的对象转换为另一种类型的对象。它不能。进程句柄不能成为事件句柄

这种错误理解由于代码缺少错误检查而变得更加复杂。Win32 API不会引发异常。错误通过API函数返回值发出信号。不幸的是,你忽视了这一点

你所做的似乎是试图以合作的方式终止一个过程。发出事件信号,表明需要终止。然后等待进程停止。只有在其他流程合作的情况下,这才有效。没有迹象表明你是这样的。您当然不能将终止事件注入到另一个进程中

如果另一个进程没有文档化的终止方式,那么您最好调用
TerminateProcess
。如果您控制着其他流程,那么您可以就终止的合作程序达成一致。使用两个进程都可以访问的命名事件

我想再重复一次我的主要建议。调用Win32函数时始终检查错误。没有一种方法可以做到这一点,您必须仔细阅读您调用的每个函数的文档