求助,关于获取模块地址的问题.
使用 GetModuleHandle可以获取一个模块的地址,如,HMODULE hm = GetModuleHandle(xxxxx.dll);就会返回地址;
请问如何获取一个xxxxx.exe 的地址呢?
如,我想获取一个HMODULE hm = GetModuleHandle(xxxxx.exe);就总会返回一个0,而不是一个正确的值;
我该怎么做才能正确返回一个exe的地址。
#include <windows.h> #include <psapi.h> #include <vector> #include <string> #include <iostream> HANDLE GetProcessHandle_ByWindow( const wchar_t* lpClassName, const wchar_t* lpWindowName ) { HWND hWnd = ::FindWindowW( lpClassName, lpWindowName ); if( !hWnd ) return nullptr; DWORD pid; if( GetWindowThreadProcessId(hWnd,&pid) == 0 ) return nullptr; return OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid ); } std::vector<std::pair<std::wstring,HMODULE>> GetModules_ByProcessHandle( HANDLE hProcess ) { std::vector<HMODULE> temp( 100, nullptr ); for( ; ; ) { DWORD cb_needed; if( !EnumProcessModulesEx(hProcess, &temp[0], DWORD(temp.size()*sizeof(HMODULE)), &cb_needed, LIST_MODULES_DEFAULT) ) return {}; if( cb_needed < temp.size()*sizeof(HMODULE) ) { temp.resize( cb_needed/sizeof(HMODULE) ); break; } temp.resize( temp.size()*2 ); } std::vector<std::pair<std::wstring,HMODULE>> result; for( const auto& h : temp ) { std::wstring basename( 10, L'?' ); for( ; ; ) { DWORD n = GetModuleBaseNameW( hProcess, h, &basename[0], (DWORD)basename.size() ); if( n == 0 ) return {}; if( n < basename.size() ) { basename.resize( n ); break; } basename.resize( basename.size()*2 ); } result.emplace_back( basename, h ); } return result; } int main( void ) { std::wcout.imbue( std::locale(std::locale(),"",std::locale::ctype) ); HANDLE hProcess = GetProcessHandle_ByWindow( L"Notepad", nullptr ); if( hProcess ) { std::vector<std::pair<std::wstring,HMODULE>> modules = GetModules_ByProcessHandle( hProcess ); for( const auto& [name,hModule] : modules ) { std::wcout << hModule << '\t' << name << '\n'; } CloseHandle( hProcess ); } return 0; }