我正在尝试在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
)部分是否存在问题?
或者还有别的我做错了吗?
答案 0 :(得分:1)
在这里使用CloseHandle
是完全正确的,它只是关于它实际上做错误的假设。它关闭刚刚由OpenProcess
打开的句柄,并且不会以任何方式帮助改变(删除或重命名)可执行文件,因为该文件在操作系统内保持打开状态。操作系统保持文件打开,因为可执行文件(和DLL)是“需求加载”,这意味着操作系统不会立即加载整个可执行文件,它只加载它实际需要的内容。稍后,当需要之前未运行的代码时,它会加载这些位。