c – 如何获取进程的文件句柄?
发布时间:2020-12-16 07:05:23 所属栏目:百科 来源:网络整理
导读:我正在尝试在C中获取任何正在运行的进程的文件句柄. 这是我的代码: #include windows.h#include process.h#include Tlhelp32.h#include winbase.h#include string.hvoid killProcessByName(const char *filename){ HANDLE hSnapShot = CreateToolhelp32Snap
我正在尝试在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,(DWORD) pEntry.th32ProcessID); if (hProcess != NULL) { CloseHandle(hProcess); } } hRes = Process32Next(hSnapShot,&pEntry); } CloseHandle(hSnapShot); } int main() { killProcessByName("WINWORD.EXE"); return 0; } 代码工作正常,但所需的句柄没有被释放. 解决方法
在这里使用CloseHandle是完全正确的,它只是关于它实际上做错误的假设.它关闭刚刚由OpenProcess打开的句柄,并且不会以任何方式帮助改变(删除或重命名)可执行文件,因为该文件在操作系统内保持打开状态.操作系统保持文件打开,因为可执行文件(和DLL)是“需求加载”,这意味着操作系统不会立即加载整个可执行文件,它只加载它实际需要的内容.稍后,当需要之前未运行的代码时,它会加载这些位.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |