当我们要更新某一个DLL时,该DLL有可能正在被使用中,我们只有先找到正在使用该DLL的进程后,关闭进程才能更新DLL,
以下我采用的是枚举的方法。
Code
#include <windows.h>
#include <tlhelp32.h>
void CheckDll(LPCTSTR dllName);
void Check(PROCESSENTRY32 *pe,LPCTSTR dllName);
int main(int argc, char* argv[])
{
LPCTSTR dllName="OneSoft.dll";
CheckDll(dllName);
return 0;
}
void CheckDll(LPCTSTR dllName)
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//建立所有进程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot failed! \n");
return ;
}
BOOL bMore=::Process32First(hProcessSnap,&pe32);//获取第一个进程信息
while(bMore)
{
Check(&pe32,dllName);
bMore=::Process32Next(hProcessSnap,&pe32);//获取下一个进程信息
}
::CloseHandle(hProcessSnap);
}
void Check(PROCESSENTRY32 *pe,LPCTSTR dllName)
{
HANDLE hSnapshot;
MODULEENTRY32 md32;
hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE,pe->th32ProcessID );//建立指定进程的所有模块快照
BOOL bMore=Module32First( hSnapshot,&md32 ); //获取第一个模块信息
while(bMore)
{
if (lstrcmpi(md32.szModule,dllName)==0)//找到
{
HANDLE h = OpenProcess( PROCESS_ALL_ACCESS,false,pe->th32ProcessID );//打开进程
BOOL bSucced=TerminateProcess(h,0); //杀进程
CloseHandle( h );
}
bMore=Module32Next( hSnapshot, &md32 );//获取下一个模块信息
}
CloseHandle( hSnapshot );
}
#include <windows.h>
#include <tlhelp32.h>
void CheckDll(LPCTSTR dllName);
void Check(PROCESSENTRY32 *pe,LPCTSTR dllName);
int main(int argc, char* argv[])
{
LPCTSTR dllName="OneSoft.dll";
CheckDll(dllName);
return 0;
}
void CheckDll(LPCTSTR dllName)
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//建立所有进程快照
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot failed! \n");
return ;
}
BOOL bMore=::Process32First(hProcessSnap,&pe32);//获取第一个进程信息
while(bMore)
{
Check(&pe32,dllName);
bMore=::Process32Next(hProcessSnap,&pe32);//获取下一个进程信息
}
::CloseHandle(hProcessSnap);
}
void Check(PROCESSENTRY32 *pe,LPCTSTR dllName)
{
HANDLE hSnapshot;
MODULEENTRY32 md32;
hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE,pe->th32ProcessID );//建立指定进程的所有模块快照
BOOL bMore=Module32First( hSnapshot,&md32 ); //获取第一个模块信息
while(bMore)
{
if (lstrcmpi(md32.szModule,dllName)==0)//找到
{
HANDLE h = OpenProcess( PROCESS_ALL_ACCESS,false,pe->th32ProcessID );//打开进程
BOOL bSucced=TerminateProcess(h,0); //杀进程
CloseHandle( h );
}
bMore=Module32Next( hSnapshot, &md32 );//获取下一个模块信息
}
CloseHandle( hSnapshot );
}