我尝试用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。
有什么问题?
答案 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));
}