C++ 获取基址不起作用

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

我需要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_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;istd::cout
lpszModuleName
缺少结尾处的
'\0'
。@halex谢谢,我会检查一下的now@halex它仍然是0!在调试器中逐步执行,找出失败的地方。对于那些拒绝投票的人,请告诉我为什么,这样我可以改进这个问题…字符串比较有些脆弱。它匹配任何包含
.exe
,比如
myapp.exe.resources.dll
。UNICODE支持可能也不会有什么坏处。@IInspectable:是的--其余的几乎都是用来演示如何使用这些函数的。还有一件事,可能更重要的是要提到:字符串比较区分大小写,即它与
myapp.exe不匹配。我想这就是OP遇到的困难。