您的位置:首页 > 其它

加载动态DLL,实现查询进程路径

2006-11-10 18:52 363 查看
前些日子我希望改写一个观察进程的小软件,想查看 每个进程的是由于哪些可执行文件启动的

总的来说是与

资源管理器差不多的一个小软件

在实现进程路径的时候 我在网上获取以下代码,可以把进程路径存入sPath了


HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,


FALSE,


pe.th32ParentProcessID );/**/////打开进程




if(! hProcess)return;


HMODULE hMod;


DWORD cbNeeded;


CString sPath = "";




if(EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )


...{


DWORD dw = 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同参数的空函数指针




typedef bool ( WINAPI *ENUMPROMODFOC ) ( HANDLE , HMODULE *,DWORD,LPDWORD);/**////定义好空数指针类型


typedef DWORD ( WINAPI *GETMODLEFILENAM) (HANDLE , HMODULE , LPTSTR ,DWORD);




HMODULE hLibrary = NULL;


if( NULL==(hLibrary = ::LoadLibrary("c:/WINDOWS/system32/psapi.dll" )) )/**/////载入动态连接库


return;




ENUMPROMODFOC EnumProcessModules = NULL; /**/////初始化


GETMODLEFILENAM GetModuleFileNameEx = NULL;




if( NULL==( EnumProcessModules = (ENUMPROMODFOC )GetProcAddress(hLibrary,"EnumProcessModules") ) )return;




if( NULL==( GetModuleFileNameEx = (GETMODLEFILENAM)GetProcAddress(hLibrary,"GetModuleFileNameExA") ) )return;





就可方便的使用以上的两个API了

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