zoukankan      html  css  js  c++  java
  • win32

    日常文件操作的时候,在删除或者移动某个文件的时候,发现它被某些进程占用了。

    那么下面的代码就可以帮助我们找出这些进程的id和name。

    原理:

    将资源注册到Restart Manager会话。重新启动管理器使用在会话中注册的资源列表来确定必须关闭并重新启动哪些应用程序和服务。

    代码:

    #include <windows.h>
    #include <RestartManager.h>
    #include <stdio.h>
    #pragma comment(lib,"Rstrtmgr.lib")
    int __cdecl wmain(int argc, WCHAR** argv)
    {
        DWORD dwSession;
        WCHAR szSessionKey[CCH_RM_SESSION_KEY + 1] = { 0 };
        DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey);
        wprintf(L"RmStartSession returned %d
    ", dwError);
        if (dwError == ERROR_SUCCESS) {
            PCWSTR pszFile = L"test.txt";
            dwError = RmRegisterResources(dwSession, 1, &pszFile,
                0, NULL, 0, NULL);
            wprintf(L"RmRegisterResources(%ls) returned %d
    ",
                pszFile, dwError);
            if (dwError == ERROR_SUCCESS) {
                DWORD dwReason;
                UINT i;
                UINT nProcInfoNeeded;
                UINT nProcInfo = 10;
                RM_PROCESS_INFO rgpi[10];
                dwError = RmGetList(dwSession, &nProcInfoNeeded,
                    &nProcInfo, rgpi, &dwReason);
                wprintf(L"RmGetList returned %d
    ", dwError);
                if (dwError == ERROR_SUCCESS) {
                    wprintf(L"RmGetList returned %d infos (%d needed)
    ",
                        nProcInfo, nProcInfoNeeded);
                    for (i = 0; i < nProcInfo; i++) {
                        wprintf(L"%d.ApplicationType = %d
    ", i,
                            rgpi[i].ApplicationType);
                        wprintf(L"%d.strAppName = %ls
    ", i,
                            rgpi[i].strAppName);
                        wprintf(L"%d.Process.dwProcessId = %d
    ", i,
                            rgpi[i].Process.dwProcessId);
                        HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,
                            FALSE, rgpi[i].Process.dwProcessId);
                        if (hProcess) {
                            FILETIME ftCreate, ftExit, ftKernel, ftUser;
                            if (GetProcessTimes(hProcess, &ftCreate, &ftExit,
                                &ftKernel, &ftUser) &&
                                CompareFileTime(&rgpi[i].Process.ProcessStartTime,
                                    &ftCreate) == 0) {
                                WCHAR sz[MAX_PATH];
                                DWORD cch = MAX_PATH;
                                if (QueryFullProcessImageNameW(hProcess, 0, sz, &cch) &&
                                    cch <= MAX_PATH) {
                                    wprintf(L"  = %ls
    ", sz);
                                }
                            }
                            CloseHandle(hProcess);
                        }
                    }
                }
            }
            RmEndSession(dwSession);
        }
        return 0;
    }

    相关: How do I find out which process has a file open?

  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/strive-sun/p/14202682.html
Copyright © 2011-2022 走看看