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

时间:2015-03-13 04:23:46

标签: 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));

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 ++的新手。

1 个答案:

答案 0 :(得分:1)

DuplicateHandle没有按照您的想法行事。它为现有对象创建了一个新句柄。您似乎认为它可以用于将一种类型的对象转换为另一种类型的对象。这不可以。进程句柄不能成为事件句柄。

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

您似乎正在尝试以合作的方式终止流程。发出事件信号以指示需要终止。然后等待进程停止。这只有在其他流程合作时才有效。没有任何迹象表明您的情况。您当然不能将终止事件注入其他进程。

如果其他流程没有记录的终止信号,那么您可以做的最好就是致电TerminateProcess。如果您掌控其他流程,那么您可以就终止合作程序达成一致。使用两个进程都可以访问的命名事件。

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