【问题标题】:When i use CloseHandle(); why is Event still visible/running当我使用 CloseHandle();为什么事件仍然可见/正在运行
【发布时间】:2021-09-07 14:57:25
【问题描述】:

我相信调用CloseHandle() 只会关闭对句柄的引用?但是该事件在 Process Explorer 中仍然可见,并且未满足所需的功能。

HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
    while (Process32Next(snapshot, &entry) == TRUE)
    {
        if (stricmp(entry.szExeFile, "program.exe") == 0)
        {
            HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
            HANDLE hEvent = OpenEventA(EVENT_ALL_ACCESS,FALSE,"openEvent");
            // Do stuff..

            int sucess = CloseHandle(hEvent);
        }
    }
    count = 0;
}
CloseHandle(snapshot);

我做错了什么吗?为什么 Event 在 Process Explorer 中仍然可见?

【问题讨论】:

  • 我会假设因为 CloseHandle 不会终止进程,它只是关闭句柄。
  • 既然你可以打开事件,它必须已经存在——这增加了使用计数,CloseHandle 再次减少它,但它没有达到零,所以事件仍然存在。跨度>
  • 如果这是您的目标,那么摆脱它的唯一方法是关闭其上所有未完成的句柄。

标签: c++ winapi


【解决方案1】:

内核对象被引用计数。调用 CloseHandle 会减少引用计数,但引用的对象不会被删除,直到它的最终句柄被关闭。

OpenEventA 返回非 NULL 值的代码中,名称引用的事件必须已经存在(即其引用计数必须至少为 1)。 OpenEventA 增加引用计数,CloseHandle 减少引用计数,但仍至少为 1(除非该事件对象的其他句柄已关闭)。

因此事件对象没有被关闭,并且 Process Explorer 正确地报告事件对象仍然存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2015-12-28
    • 2011-06-15
    相关资源
    最近更新 更多