You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2019下C++代码的pch.h错误及三类警告修复求助

问题修复:VS2019中C++代码的pch.h错误与3个警告解决

一、#include "pch.h" 错误修复

针对这个错误,按以下两种场景处理:

  • 若项目不需要预编译头:右键项目→属性→配置属性→C/C++→预编译头,将“预编译头”选项改为“不使用预编译头”,然后删除代码中的#include "pch.h"。
  • 若项目需要预编译头:确保项目根目录存在pch.h和pch.cpp文件,且#include "pch.h"是代码中第一个被包含的头文件。

二、三个警告的修复

1. 使用未初始化内存警告(涉及processesSnapshot)

问题核心:原GetPID函数中,找到目标进程后提前关闭了句柄,但后续while(Process32Next(...))仍在使用已失效的句柄;同时逻辑错误,找到匹配进程后未立即返回,导致最终返回的PID可能不是目标进程的ID。

修复后的GetPID函数:

DWORD GetPID(const char* ProcessName) {
    PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);

    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (processesSnapshot == INVALID_HANDLE_VALUE)
        return 0;

    DWORD targetPID = 0;
    // 先检查第一个进程
    if (Process32First(processesSnapshot, &processInfo)) {
        if (!strcmp(processInfo.szExeFile, ProcessName)) {
            targetPID = processInfo.th32ProcessID;
        } else {
            // 遍历剩余进程,找到后立即退出循环
            while (Process32Next(processesSnapshot, &processInfo)) {
                if (!strcmp(processInfo.szExeFile, ProcessName)) {
                    targetPID = processInfo.th32ProcessID;
                    break;
                }
            }
        }
    }
    CloseHandle(processesSnapshot); // 统一在最后关闭句柄,避免无效句柄被复用
    return targetPID;
}

2. unsigned __int64转unsigned long/DWORD的参数转换警告

问题核心:main函数中pid被定义为unsigned long long,但GetModule的第二个参数是unsigned long,OpenProcess的第三个参数是DWORD(等价于unsigned long),64位类型转32位类型会触发数据丢失警告。

修复方式:将pid的类型改为Windows API标准的进程ID类型DWORD,同时同步修改GetModule的参数类型:

// 修改GetModule的参数类型为DWORD
MODULEENTRY32 GetModule(const char* moduleName, DWORD ProcessID)
{
    MODULEENTRY32 modEntry = { 0 };

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, ProcessID);

    if (hSnapshot != INVALID_HANDLE_VALUE) {
        MODULEENTRY32 curr = { 0 };
        curr.dwSize = sizeof(MODULEENTRY32);
        if (Module32First(hSnapshot, &curr)) {
            do {
                if (!strcmp(curr.szModule, moduleName)) {
                    modEntry = curr;
                    break;
                }
            } while (Module32Next(hSnapshot, &curr));
        }
        CloseHandle(hSnapshot);
    }
    return modEntry;
}

// main函数中pid改为DWORD类型
int main()
{
    std::cout << "Hello World!\n";
    DWORD pid = GetPID("ac_client.exe");
    MODULEENTRY32 module = GetModule("ac_client.exe", pid);
    HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    // 内存地址相关的unsigned long long保留以适配64位进程
    unsigned long long result;
    int ammodesiredvalue = 999999;
    ReadProcessMemory(phandle, (void*)((unsigned long long)module.modBaseAddr + 0x0010B1E0), &result, sizeof(result), 0);
    ReadProcessMemory(phandle, (void*)((unsigned long long)result + 0x54), &result, sizeof(result), 0);
    ReadProcessMemory(phandle, (void*)((unsigned long long)result + 0x14), &result, sizeof(result), 0);
    WriteProcessMemory(phandle, (void*)((unsigned long long)result + 0x14), &ammodesiredvalue, sizeof(ammodesiredvalue), 0);
    std::cout << "Your ammo value is " << result << std::endl;

    system("pause");
}

修复后的完整代码

#include "pch.h" // 不需要预编译头可删除
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
#include <cstring>

DWORD GetPID(const char* ProcessName) {
    PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);

    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (processesSnapshot == INVALID_HANDLE_VALUE)
        return 0;

    DWORD targetPID = 0;
    if (Process32First(processesSnapshot, &processInfo)) {
        if (!strcmp(processInfo.szExeFile, ProcessName)) {
            targetPID = processInfo.th32ProcessID;
        } else {
            while (Process32Next(processesSnapshot, &processInfo)) {
                if (!strcmp(processInfo.szExeFile, ProcessName)) {
                    targetPID = processInfo.th32ProcessID;
                    break;
                }
            }
        }
    }
    CloseHandle(processesSnapshot);
    return targetPID;
}

MODULEENTRY32 GetModule(const char* moduleName, DWORD ProcessID)
{
    MODULEENTRY32 modEntry = { 0 };

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, ProcessID);

    if (hSnapshot != INVALID_HANDLE_VALUE) {
        MODULEENTRY32 curr = { 0 };
        curr.dwSize = sizeof(MODULEENTRY32);
        if (Module32First(hSnapshot, &curr)) {
            do {
                if (!strcmp(curr.szModule, moduleName)) {
                    modEntry = curr;
                    break;
                }
            } while (Module32Next(hSnapshot, &curr));
        }
        CloseHandle(hSnapshot);
    }
    return modEntry;
}

int main()
{
    std::cout << "Hello World!\n";
    DWORD pid = GetPID("ac_client.exe");
    if (pid == 0) {
        std::cout << "未找到ac_client.exe进程\n";
        system("pause");
        return 1;
    }
    MODULEENTRY32 module = GetModule("ac_client.exe", pid);
    if (module.modBaseAddr == 0) {
        std::cout << "未找到ac_client.exe模块\n";
        system("pause");
        return 1;
    }
    HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (phandle == NULL) {
        std::cout << "打开进程失败,错误码:" << GetLastError() << "\n";
        system("pause");
        return 1;
    }

    unsigned long long result;
    int ammodesiredvalue = 999999;
    if (!ReadProcessMemory(phandle, (void*)((unsigned long long)module.modBaseAddr + 0x0010B1E0), &result, sizeof(result), nullptr)) {
        std::cout << "读取内存失败,错误码:" << GetLastError() << "\n";
        CloseHandle(phandle);
        system("pause");
        return 1;
    }
    if (!ReadProcessMemory(phandle, (void*)((unsigned long long)result + 0x54), &result, sizeof(result), nullptr)) {
        std::cout << "读取内存失败,错误码:" << GetLastError() << "\n";
        CloseHandle(phandle);
        system("pause");
        return 1;
    }
    if (!ReadProcessMemory(phandle, (void*)((unsigned long long)result + 0x14), &result, sizeof(result), nullptr)) {
        std::cout << "读取内存失败,错误码:" << GetLastError() << "\n";
        CloseHandle(phandle);
        system("pause");
        return 1;
    }
    if (!WriteProcessMemory(phandle, (void*)((unsigned long long)result + 0x14), &ammodesiredvalue, sizeof(ammodesiredvalue), nullptr)) {
        std::cout << "写入内存失败,错误码:" << GetLastError() << "\n";
        CloseHandle(phandle);
        system("pause");
        return 1;
    }
    std::cout << "当前弹药值为:" << result << std::endl;

    CloseHandle(phandle);
    system("pause");
    return 0;
}

内容的提问来源于stack exchange,提问作者Muhammed Mostaafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:55:20