公司程序需要程序卸载后删除某个特定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; }