您的位置:首页 > 其它

获取进程模块

2012-01-05 12:57 120 查看
当我们要更新某一个DLL时,该DLL有可能正在被使用中,我们只有先找到正在使用该DLL的进程后,关闭进程才能更新DLL,

以下我采用的是枚举的方法。

#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 );

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: