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
相关产品推荐
相关产品推荐

