在我的程序中不可能声明 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));
}
我尝试用 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));
}