4

我正在尝试获取 C++ 中任何正在运行的进程的文件句柄。这是我的代码:

#include <windows.h>
#include <process.h>
#include <Tlhelp32.h>
#include <winbase.h>
#include <string.h>
void killProcessByName(const char *filename)
{
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    PROCESSENTRY32 pEntry;
    pEntry.dwSize = sizeof (pEntry);
    BOOL hRes = Process32First(hSnapShot, &pEntry);
    while (hRes)
    {
        if (strcmp(pEntry.szExeFile, filename) == 0)
        {
            HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0,
                                          (DWORD) pEntry.th32ProcessID);
            if (hProcess != NULL)
            { 
                CloseHandle(hProcess);
            }
        }
        hRes = Process32Next(hSnapShot, &pEntry);
    }
    CloseHandle(hSnapShot);
}
int main()
{
    killProcessByName("WINWORD.EXE");
    return 0;
}

代码工作正常,但没有释放所需的句柄。比较 ( strcmp) 部分有问题吗?还是我做错了什么?

4

1 回答 1

1

这里的使用CloseHandle是完全正确的,只是假设它实际上做了什么是错误的。它关闭刚刚打开的句柄OpenProcess,并且不会以任何方式帮助更改(删除或重命名)可执行文件,因为该文件在操作系统内保持打开状态。操作系统保持文件打开,因为可执行文件(和 DLL)是“按需加载”的,这意味着操作系统不会立即加载整个可执行文件,它只加载它暂时实际需要的内容。稍后,当需要以前没有运行过的代码时,它会加载这些位。

于 2013-07-30T13:11:31.073 回答