我的程序中的Imposible声明INT变量

时间:2015-07-15 21:26:00

标签: c++ winapi c++11 int declaration

我尝试用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;
}

通过此更改,程序将崩溃,显示警报“程序停止工作”。

我试图找到问题,我已经确定了以下内容:

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

有什么问题?

2 个答案:

答案 0 :(得分:3)

这里有很多问题。我在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;
    }

答案 1 :(得分:3)

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

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

  • dwSize结构的PROCESSENTRY32成员未按Process32First documentation

    中所述进行初始化
      

    调用应用程序必须将PROCESSENTRY32的dwSize成员设置为结构的大小(以字节为单位)。

第三个更小的错误是你忽略了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));
}