【发布时间】:2021-01-26 07:36:02
【问题描述】:
我正在尝试显示有关系统上每个进程的虚拟内存的信息:
#include <windows.h>
#include <conio.h>
#include <tlhelp32.h>
#include <iostream>
using namespace std;
void main() {
HANDLE CONST hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
PROCESSENTRY32 proc;
TCHAR Buffer[1024];
TCHAR Buffer2[1024];
DWORD temp;
HANDLE CONST hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnap)
{
return;
}
proc.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &proc);
do {
MEMORY_BASIC_INFORMATION mbi = {};
wsprintf(Buffer, L" %s %d \n ", proc.szExeFile, proc.th32ProcessID);
WriteConsole(hStdOut, Buffer, lstrlen(Buffer), &temp, NULL);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc.th32ProcessID);
VirtualQueryEx(hProcess, 0, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
printf("Alloc = %p, base = %p , size = %d, type = %d, state = %p\n", mbi.AllocationBase, mbi.BaseAddress, mbi.RegionSize, mbi.Type,mbi.State);
} while (Process32Next(hSnap, &proc));
CloseHandle(hSnap);
}
输出如下所示:
我得到基地址和分配等于 0000000 并输入 0 如何获得正常值?我的意思是大小和状态似乎还可以,但其余的是“0000000” 不知道是什么问题
【问题讨论】:
-
尝试检查它之前的每个函数的返回值,并将它们与文档进行比较。问题可能不在您认为的位置。
-
您的 printf 格式字符串与您的参数类型不对应。更喜欢
std::cout。 -
注意编译器警告,在编译你的代码时,我收到三个不同的 printf 调用警告。所有与格式字符串的错误类型有关。但正如我所说,最简单的方法是使用
std::cout。 -
cout 不起作用
-
@DussyPestroyer 请详细说明,它是否无法编译?如果是这样,它会产生什么错误?或者它只是不写任何东西? (另外,在您的回复中标记人。这样,与您交谈的人都会收到通知)
标签: c++ winapi virtualquery