Windows查看所有进程中所有使用某一特定dll的进程,找到并杀死进程

公司程序需要程序卸载后删除某个特定dll,这个dll会被其他程序调用,即使regsvr32 /u以后还有可能被很多程序占用,这种情况底下这段代码就帮了大忙了。不过目前用不了,我们的程序很有可能被Word在占用,突然关闭word导致用户的文档没有保存就被关闭了,有点太影响使用体验了,这个方案先保留

这个方法的基本思路是遍历进程,拿到进程的句柄后遍历进程中使用的模块的名字,跟我删除的dll的名字对比符合,即中断进程,然后依次往复关掉所有在占用此dll的进程。

#include <windows.h>
#include <iostream>
#include <tlhelp32.h>
using namespace std;



bool traverseProcesses(WCHAR *szModule)
{
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);
    
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        printf("创建进程快照失败");
        return 0;
    }
    BOOL bResult = Process32First(hProcessSnap, &pe32);
    int num(0);
    while (bResult)
    {
        MODULEENTRY32 te = { sizeof(te) };
        HANDLE hmoudleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);
        BOOL bRet = Module32First(hmoudleSnap, &te);

        while (bRet) 
        {
            if (0 == memcmp(szModule, te.szModule, wcslen(szModule)))
            {
                cout << "[" << ++num << "] : " << "ProcessName:" << pe32.szExeFile << "  " << "ProcessID:" << pe32.th32ProcessID << endl;
                HANDLE ProcessKill = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
                TerminateProcess(ProcessKill, 0);
                CloseHandle(ProcessKill);
                break;
            }
            bRet = Module32Next(hmoudleSnap, &te);
        }
        CloseHandle(hmoudleSnap);
        bResult = Process32Next(hProcessSnap, &pe32);
    }
    CloseHandle(hProcessSnap);

    return true;
}


int _tmain(int argc, _TCHAR* argv[])
{
    traverseProcesses(L"111(1).docx");
    system("pause");
    return 0;
}