C++ 从exe c++;

C++ 从exe c++;,c++,winapi,openprocess,C++,Winapi,Openprocess,我试图用openprocess从这个exe中获取基起始地址,但当我运行代码时,我一直崩溃,我没有发现它有任何问题 HMODULE GetModule(HANDLE han) { HMODULE hMods[1024]; int i; DWORD cbNeeded; char szProcessName[MAX_PATH] = "Minesweeper.exe"; EnumProcessModules(han, hMods, sizeof(hMods), &

我试图用openprocess从这个exe中获取基起始地址,但当我运行代码时,我一直崩溃,我没有发现它有任何问题

HMODULE GetModule(HANDLE han)
{
    HMODULE hMods[1024];
    int i;
    DWORD cbNeeded;
    char szProcessName[MAX_PATH] = "Minesweeper.exe";
    EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
    for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
    {
        TCHAR szModName[MAX_PATH];
        GetModuleFileNameEx(han, hMods[i], szProcessName, sizeof(szModName));
        //printf(TEXT("\t%s (0x%08X)\n"), szModName, hMods[i]);
        if (szModName == szProcessName)
        {
            cout << "FOUND" << endl;
        }
    }
    return 0;
}
HMODULE GetModule(句柄)
{
HMODULE-hMods[1024];
int i;
德沃德;
char szProcessName[MAX_PATH]=“mineswipper.exe”;
EnumProcessModule(需要han、hMods、sizeof(hMods)和CBD);
对于(i=0;i<(cbNeeded/sizeof(HMODULE));i++)
{
TCHAR szModName[最大路径];
GetModuleFileNameEx(han,hMods[i],szProcessName,sizeof(szModName));
//printf(文本(“\t%s(0x%08X)\n”)、szModName、hMods[i]);
if(szModName==szProcessName)
{

cout您的代码有几个问题:

  • 您正在使用
    TCHAR
    ,但没有始终如一地使用
    TCHAR
  • 您使用的是
    ==
    而不是正确的字符串比较函数

  • 调用
    GetModuleFileNameEx
    使用了错误的数组
这是您的代码的一个清理版本,带有更正(未经测试,但解决了大部分(如果不是全部)代码问题):

HMODULE GetModule(句柄)
{
HMODULE-hMods[1024];
int i;
德沃德;
TCHAR szProcessName[MAX_PATH]=“mineswipper.exe”);
EnumProcessModule(需要han、hMods、sizeof(hMods)和CBD);
对于(i=0;i<(cbNeeded/sizeof(HMODULE));i++)
{
TCHAR szModName[最大路径];
GetModuleFileNameEx(han,hMods[i],szModName,sizeof(szModName)/sizeof(TCHAR));
if(_tcscmp(szModName,szProcessName)==0)
{

难道这个问题应该有一些特定于Windows的标记,但我不知道应该应用哪些标记。
GetModuleFileNameEx
的最后一个参数是以字符而不是字节度量的,所以你不应该使用
sizeof
来解决这个问题。在Unicode构建中,这可能会导致崩溃。我使用的是多字节项目,我也使用了printf,我可以通信我得到了一些地址,但在打印完所有地址后,我崩溃了。此外,您从未写入
szModName
GetModuleFileName
第三个和第四个参数使用不同的变量),并且您不能将C样式字符串与
==
进行比较,您需要
strcmp
@JhonBrian Im使用多字节项目--但是您使用的是
TCHAR
,因此您应该编写正确的代码,而不是字符数。此函数仍然会崩溃,对我来说运行正常,没有崩溃。但是,
getmoduleeFileNameEx()
是一个完全限定的路径和文件名,因此您必须使用类似于
PathFindFileName(szModName)的内容
在将其与
szProcessName
@JhonBrian进行比较之前,要将其截断为文件名,您需要使用调试器来告诉我们该崩溃在哪一行。这将大大有助于您正确编写函数和/或识别您遇到的问题。鉴于此,我编写的是你需要改正,因为你原来的帖子显然是错的。
HMODULE GetModule(HANDLE han)
{
    HMODULE hMods[1024];
    int i;
    DWORD cbNeeded;
    TCHAR szProcessName[MAX_PATH] = _T("Minesweeper.exe");
    EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded);
    for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++)
    {
        TCHAR szModName[MAX_PATH];
        GetModuleFileNameEx(han, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR));
        if ( _tcscmp(szModName,szProcessName) == 0)
        {
            cout << "FOUND" << endl;
        }
    }
    return 0;
}