C++ 获取基址不起作用
我需要exe“tibo.exe”的基址。这是我目前得到的,但不起作用。它总是返回C++ 获取基址不起作用,c++,winapi,base-address,C++,Winapi,Base Address,我需要exe“tibo.exe”的基址。这是我目前得到的,但不起作用。它总是返回0 怎么了 DWORD MainWindow::getBaseAddress(DWORD dwProcessIdentifier) { TCHAR lpszModuleName[] = {'t','i','b','i','a','.','e','x','e','\0'}; //tibia.exe HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SN
0
怎么了
DWORD MainWindow::getBaseAddress(DWORD dwProcessIdentifier)
{
TCHAR lpszModuleName[] = {'t','i','b','i','a','.','e','x','e','\0'}; //tibia.exe
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
dwProcessIdentifier);
DWORD dwModuleBaseAddress = 0;
if(hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32;
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if(Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if( wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
}
while(Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
//Call it here
tibiaWindow = FindWindow( L"TibiaClient", NULL);
DWORD PID;
GetWindowThreadProcessId( tibiaWindow, &PID );
DWORD baseAddress = getBaseAddress( PID );
if( baseAddress == 0 )
return false ;
也许这只是因为我在ToolHelp32可用之前使用过它们(至少在基于NT的操作系统上),但我倾向于使用PSAPI函数来完成这类任务。使用它们,代码将如下所示:
#include <windows.h>
#include <string>
#include <psapi.h>
#include <iostream>
int main(int argc, char **argv) {
HANDLE process = GetCurrentProcess();
if (argc != 1)
process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, atoi(argv[1]));
HMODULE handles[2048];
DWORD needed;
EnumProcessModules(process, handles, sizeof(handles), &needed);
for (int i = 0; i < needed / sizeof(handles[0]); i++) {
MODULEINFO info;
char name[1024];
GetModuleBaseName(process, handles[i], name, sizeof(name));
if (std::string(name).find(".exe") != std::string::npos) {
GetModuleInformation(process, handles[i], &info, sizeof(info));
std::cout << name << ": " << info.lpBaseOfDll << "\n";
break;
}
}
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
HANDLE process=GetCurrentProcess();
如果(argc!=1)
process=OpenProcess(process_QUERY_INFORMATION | process_VM_READ,false,atoi(argv[1]));
HMODULE句柄[2048];
德沃德需要;
EnumProcessModule(进程、句柄、sizeof(句柄)和所需);
for(int i=0;i std::coutlpszModuleName
缺少结尾处的'\0'
。@halex谢谢,我会检查一下的now@halex它仍然是0!在调试器中逐步执行,找出失败的地方。对于那些拒绝投票的人,请告诉我为什么,这样我可以改进这个问题…字符串比较有些脆弱。它匹配任何包含.exe
,比如myapp.exe.resources.dll
。UNICODE支持可能也不会有什么坏处。@IInspectable:是的--其余的几乎都是用来演示如何使用这些函数的。还有一件事,可能更重要的是要提到:字符串比较区分大小写,即它与myapp.exe不匹配代码>。我想这就是OP遇到的困难。