在我的程序中不可能声明 INT 变量

Imposible declaration INT variable in my program

我尝试用 C++ 创建一个小项目。我的程序应该能够读取 Windows 中当前的 运行 进程,并每 5 分钟将有关进程的信息发送到我的私人 MySQL 数据库。在这段时间里,我可以阅读流程。

查看下面的代码:

#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>

bool getAllProcesses(void);

int main(void){
    getAllProcesses();
}

bool getAllProcesses(){
    HANDLE WINAPI snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    LPPROCESSENTRY32 pe32;

    Process32First(snapshot, pe32);
    while(Process32Next(snapshot, pe32)){
        std::cout << pe32->szExeFile << "\n";
    }
    std::cout << "End of list";
    CloseHandle( snapshot );
    return true;
}

上面的代码运行良好。

但是如果我像这样添加代码 "int i;i=1;":

#include <stdio.h>
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>

bool getAllProcesses(void);

int main(void){
    getAllProcesses();
}

bool getAllProcesses(){
    int i;
    i=0;
    HANDLE WINAPI snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    LPPROCESSENTRY32 pe32;

    Process32First(snapshot, pe32);
    while(Process32Next(snapshot, pe32)){
        std::cout << pe32->szExeFile << "\n";
    }
    std::cout << "End of list";
    CloseHandle( snapshot );
    return true;
}

进行此更改后,程序将崩溃,并显示警报 "Program stop the work"。

我试图找到问题并确定了以下内容:

如果我使用 Process32First() 或 Process32Next() 函数,我无法在所有程序中声明相同的 int。

问题是什么?

你这里有很多问题。我在 VS 2008 Win7 上试过这个。 "i" 声明与问题无关,但可能只是稍微移动了堆栈以隐藏真正的问题。在下面更正的代码中查看我的评论。

  bool getAllProcesses(){
        int i;
        i=0;
        HANDLE WINAPI snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
       /* replace LPPROCESSENTRY32 with PROCESSENTRY32. LP is just a define as
 a pointer to a structure, so you did not actually allocate any memory for the
 return of Process32First() to return the result into.
 So you were probably overwriting stuff in the stack. */

        PROCESSENTRY32 pe32;

       /* need to initialize the structure properly. Memset may be overkill,
         but better to see all zeros than garbage.  dwSize must be
         initialized as per the SDK documentation. */
        memset(&pe32,0,sizeof(pe32) );
        pe32.dwSize = sizeof(pe32);
        BOOL result;

        /* did not check the result from the call if TRUE/FALSE */
        result = Process32First(snapshot, &pe32);

        std::cout << "result ="  << result << "\n";
        while(Process32Next(snapshot, &pe32)){
            std::cout << pe32.szExeFile << "\n";
        }
        std::cout << "End of list";
        CloseHandle( snapshot );
        return true;
    }

添加这两行使程序无法 运行 只是巧合。该程序根本不应该 运行ning,因为有 2 个主要错误:

  • pe32是一个未初始化的指针

  • dwSize PROCESSENTRY32 结构的成员未按照 [MS.Docs]: Process32First function 中所述进行初始化:

    The calling application must set the dwSize member of PROCESSENTRY32 to the size, in bytes, of the structure.

第三个较小的错误是您忽略了 Process32First.

返回的过程数据

为了使事情正常工作,请替换以下代码行:

LPPROCESSENTRY32 pe32;

Process32First(snapshot, pe32);
while(Process32Next(snapshot, pe32)){
    std::cout << pe32->szExeFile << "\n";

,其中:

PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);

if (Process32First(snapshot, &pe32))
{
    do {
        std::cout << pe32.szExeFile << "\n";
    }
    while (Process32Next(snapshot, &pe32));
}