【问题标题】:How to get file handle of a process?如何获取进程的文件句柄?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2014-01-18
    • 2015-03-07
    相关资源
    最近更新 更多