【发布时间】:2013-07-30 12:00:29
【问题描述】:
我正在尝试获取 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 ) 部分有问题吗?
还是我做错了什么?
【问题讨论】:
-
“手柄没有被释放”是什么意思?在这种情况下,“释放”是什么意思。您正在打开一个进程,然后再次关闭句柄。那应该释放句柄-您通过什么方式确定未释放某些内容?或者您是否只是期望您的 OpenProcess 以某种方式做的不仅仅是为您提供该流程的句柄 - 例如。和
TerminateProcess(handle)的效果一样吗? -
发布时,我指的是 * CloseHandle* 。此句柄没有被释放/关闭。我的文件的句柄仍然处于活动状态,我无法删除或重命名它。是的,我不希望 Openprocess() 做类似 :terminateprocess() 的事情。我知道它应该给我一个把柄。但问题是我的程序在 strcmp 处出错。为什么会这样?
-
"errs at strcmp" 到底是什么意思?而
CloseHandle这里只是关闭你刚刚用OpenProcess打开的句柄,例如,它不允许你重命名当前正在运行的 .exe 文件 - 操作系统保持这个文件打开直到它退出 - 没有外部操纵将改变这一点。 -
当然不是,一旦我释放它的句柄,它会允许我删除或重命名它,即使它被打开了,否则不能!不需要退出。这就是我不使用 TerminateProces() 的原因。我只需要松开手柄。但它不起作用。我很困惑为什么?
-
不,因为您关闭的句柄与
CreateProcess()中的操作系统打开的句柄不同 - 这就像说调用FILE *f = fopen("foo.txt", "r"); fclose(f);将关闭由记事本保持打开的foo.txt。 ..
标签: c++ filehandle