加载动态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
总的来说是与
资源管理器差不多的一个小软件
在实现进程路径的时候 我在网上获取以下代码,可以把进程路径存入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
相关文章推荐
- DLL加载时动态链接路径
- VC++通过动态生成并加载DLL,实现可执行文件的自删除
- 动态加载不同路径下的DLL
- vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法
- c# 动态加载dll文件,并实现调用其中的方法
- 动态加载MATLAB生成的dll并反射dll里的函数,实现多返回值的功能
- C#实现反射调用动态加载的DLL文件中的方法
- c++动态加载dll中的类(用于实现依据字符串类名创建对象)
- VC++通过动态生成并加载DLL,实现可执行文件的自删除
- c#实现动态加载Dll
- c#实现动态加载Dll(转)
- c# 动态加载dll文件,并实现调用其中的简单方法
- 简易C#动态加载dll(实现插件化)
- VC++通过动态生成并加载DLL,实现可执行文件的自删除
- DLL的类库怎样实现动态加载调用
- C#实现从dll程序集中动态加载窗体
- 动态加载DLL实现不同DLL的相同导出函数调用问题
- C#实现反射调用动态加载的DLL文件中的方法
- DLL的类库怎样实现动态加载调用
- C#实现反射调用动态加载的DLL文件中的方法