怎么样加载动态DLL实现查询进程路径?
前些日子我希望改写一个观察进程的小软件,想查看每个进程的是由于哪些可执行文件启动的
总的来说是与
资源管理器差不多的一个小软件
在实现进程路径的时候 我在网上获取以下代码,可以把进程路径存入sPath了
HANDLEhProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,
FALSE,
pe.th32ParentProcessID);////打开进程
if(!hProcess)return;
HMODULEhMod;
DWORDcbNeeded;
CStringsPath="";
if(EnumProcessModules(hProcess,&hMod,sizeof(hMod),&cbNeeded))
{
DWORDdw=GetModuleFileNameEx(hProcess,hMod,sPath.GetBuffer(MAX_PATH),MAX_PATH);
//////////////////////////////////////////////////
sPath.ReleaseBuffer();
CloseHandle(hProcess);
}
FALSE,
pe.th32ParentProcessID);////打开进程
if(!hProcess)return;
HMODULEhMod;
DWORDcbNeeded;
CStringsPath="";
if(EnumProcessModules(hProcess,&hMod,sizeof(hMod),&cbNeeded))
{
DWORDdw=GetModuleFileNameEx(hProcess,hMod,sPath.GetBuffer(MAX_PATH),MAX_PATH);
//////////////////////////////////////////////////
sPath.ReleaseBuffer();
CloseHandle(hProcess);
}
但是遇到一个问题 我的VC6 sdk比较老了
没有psapi.lib和psapi.h
没有 GetModuleFileNameEx EnumProcessModules 包含在psapi.h
我在CSDN上发现 一个回复是用LoadLibrary加载 psapi.dll
于是我先找到机子上的psapi.dll
再下一个"Viewdll"DLL函数观察器
打开psapi.dll,果然发现GetModuleFileNameEx EnumProcessModules
两个API,于是我就用以下代码加载
注意:先定义两个分别与以上API同参数的空函数指针
typedefbool(WINAPI*ENUMPROMODFOC)(HANDLE,HMODULE*,DWORD,LPDWORD);///定义好空数指针类型
typedefDWORD(WINAPI*GETMODLEFILENAM)(HANDLE,HMODULE,LPTSTR,DWORD);
HMODULEhLibrary=NULL;
if(NULL==(hLibrary=::LoadLibrary("c:/WINDOWS/system32/psapi.dll")))////载入动态连接库
return;
ENUMPROMODFOCEnumProcessModules=NULL;////初始化
GETMODLEFILENAMGetModuleFileNameEx=NULL;
if(NULL==(EnumProcessModules=(ENUMPROMODFOC)GetProcAddress(hLibrary,"EnumProcessModules")))return;
if(NULL==(GetModuleFileNameEx=(GETMODLEFILENAM)GetProcAddress(hLibrary,"GetModuleFileNameExA")))return;
typedefDWORD(WINAPI*GETMODLEFILENAM)(HANDLE,HMODULE,LPTSTR,DWORD);
HMODULEhLibrary=NULL;
if(NULL==(hLibrary=::LoadLibrary("c:/WINDOWS/system32/psapi.dll")))////载入动态连接库
return;
ENUMPROMODFOCEnumProcessModules=NULL;////初始化
GETMODLEFILENAMGetModuleFileNameEx=NULL;
if(NULL==(EnumProcessModules=(ENUMPROMODFOC)GetProcAddress(hLibrary,"EnumProcessModules")))return;
if(NULL==(GetModuleFileNameEx=(GETMODLEFILENAM)GetProcAddress(hLibrary,"GetModuleFileNameExA")))return;
就可方便的使用以上的两个API了
详细事项请参阅MSDN
本文地址:http://www.45fan.com/dnjc/71036.html