小标
2018-08-14
来源 :
阅读 1263
评论 0
摘要:本文主要向大家介绍了VC编程枚举进程,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
本文主要向大家介绍了VC编程枚举进程,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。
有时我们在使用VC开发时,根据需要偶尔需要查看系统当前正在运行中的所有的进程,此时,可以使用VC开发中给我们提供的一种方法——枚举进程,以下介绍两个实例,主要是通过查看网上其他网友的文章,以及在MSDN上面搜索后本人再进行整理得到的历程。具体的话可以查看每个例子给出相应的网站。
以下每个例子都在VC2010测试通过!
第一个例子:给当前系统运行的所有进程“拍个照”,然后逐个将它们打印出
//例程 https://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <iostream>
using namespace std;
// 枚举当前系统中的所有进程
bool ListProcess();
// 枚举某个进程所使用的模块, dwPID 为要检查的进程的进程号
bool ListProcessModules( DWORD dwPID = 0 );
int main()
{
ListProcess();
//ListProcessModules(5308);
return 0;
}
bool ListProcess()
{
HANDLE hSnapShot = INVALID_HANDLE_VALUE;
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof( PROCESSENTRY32 );// 必须加这句
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if(hSnapShot == INVALID_HANDLE_VALUE)
{
cout<<(_T("error!"));
return false;
}
BOOL More;
More = ::Process32First(hSnapShot, &pe32);
int processNum = 0;
while(More)
{
cout<< "process name: "<<pe32.szexefile<<endl; cout<<="" "process="" id:="" "<<pe32.th32processid<<endl;="" *if(strcmp(pe32.szexefile,="" _t("octave.exe"))="=" 0)="" {="" closehandle(hsnapshot);="" return="" 0;="" }*="" more="::Process32Next(hSnapShot," &pe32);="" processnum++;="" }="" cout<<processnum<<"="" processes\n";="" true;="" bool="" listprocessmodules(="" dword="" dwpid="" )="" handle="" hmodulesnap="INVALID_HANDLE_VALUE;" moduleentry32="" me32;="" me32.dwsize="sizeof(MODULEENTRY32);//" 必须加这句="" th32cs_snapmodule,="" );="" if(="" invalid_handle_value)="" cout<<(_t("error!"));="" false;="" int="" modulenum="0;" more;="" &me32);="" while(more)="" cout<<"process="" path:="" "<<me32.szexepath<<endl;="" "<<me32.th32processid<<endl;="" cout<<"module="" "<<me32.th32moduleid<<endl;="" name:="" "<<me32.szmodule<<endl<<endl;="" me32.="" ++;="" closehandle(hmodulesnap);="" cout<<modulenum<<"="" module!\n";="" <="" pre="">
<p><br>
</p>
<p> </p>
<p>第二个实例:通过使用EnumProcesses函数来枚举系统当前运行的进程。</p>
<p>//
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx<br>
//
https://blog.csdn.net/snjdju/article/details/5562409</p>
<pre class="brush:java;">#include <windows.h>
#include <stdio.h>
//#include <tchar.h>
#include <psapi.h>
#include <iostream>
using std::cout;
using std::endl;
HMODULE hPsDll = LoadLibraryA("PSAPI.DLL");
typedef BOOL (_stdcall *ENUMPROCESSES)( //注意这里要指明调用约定为-stdcall
LPDWORD pProcessIds, //指向进程ID数组链
DWORD cb, //ID数组的大小,用字节计数
LPDWORD pBytesReturned); //返回的字节
typedef BOOL (_stdcall *ENUMPROCESSMODULES)(
HANDLE hProcess, //进程句柄
HMODULE* lphModule, //指向模块句柄数组链
DWORD cb, //模块句柄数组大小,字节计数
LPDWORD lpcbNeeded);//存储所有模块句柄所需的字节数
typedef DWORD (_stdcall *GETMODULEFILENAMEEX)(
HANDLE hProcess, //进程句柄
HMODULE hModule, //进程句柄
LPTSTR lpFilename, //存放模块全路径名
DWORD nSize //lpFilename缓冲区大小,字符计算
);
ENUMPROCESSES pEnumProcesses = (ENUMPROCESSES)GetProcAddress(hPsDll, "EnumProcesses");
ENUMPROCESSMODULES pEnumProcessModules = (ENUMPROCESSMODULES)GetProcAddress(hPsDll, "EnumProcessModules");
GETMODULEFILENAMEEX pGetModuleFileNameEx = (GETMODULEFILENAMEEX)GetProcAddress(hPsDll, "GetModuleFileNameExA");
//#define EnumProcesses pEnumProcesses
bool ListProcessNameAndID();
bool PrintProcessNameAndID(DWORD PID);
int main()
{
ListProcessNameAndID();
return 0;
}
bool ListProcessNameAndID()
{
DWORD pProcessesID[1024], cbReturn, cProcessesReturn;
if( !::pEnumProcesses(pProcessesID, sizeof(pProcessesID), &cbReturn) )
return false;
cProcessesReturn = cbReturn / sizeof(DWORD);
size_t i = 0;
for( ; i < cProcessesReturn; i++)
{
PrintProcessNameAndID( pProcessesID[i] );
}
cout<<cprocessesreturn<<" processes!"<<endl;="" return="" true;="" }="" bool="" printprocessnameandid(dword="" pid)="" {="" char="" szprocessname[max_path]="{0};" handle="" hprocess="OpenProcess(PROCESS_QUERY_INFORMATION" |="" process_vm_read,="" false,="" pid);="" if(hprocess="" !="NULL)" hmodule="" hmod;="" dword="" cbneeded;="" if(="" ::penumprocessmodules(hprocess,="" &hmod,="" sizeof(hmod),="" &cbneeded)="" )="" !pgetmodulefilenameex(hprocess,="" hmod,="" szprocessname,="" sizeof(szprocessname)="" sizeof(char))="" false;="" else="" cout<<"process="" name:="" "<<szprocessname<<endl="" <<"process="" id:="" "<<pid<<endl;="" closehandle(hprocess);="" }<="" pre="">
<p> </p>
<p> </p>
<p> </p>
<p><br>
参考网站:</p>
<p>
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686701(v=vs.85).aspx</p>
<p>
https://msdn.microsoft.com/en-us/library/windows/desktop/ms682623(v=vs.85).aspx<br>
https://blog.csdn.net/snjdju/article/details/5562409<br>
</p> </cprocessesreturn<<"></iostream></psapi.h></tchar.h></stdio.h></windows.h></pre></pe32.szexefile<<endl;></iostream></tchar.h></tlhelp32.h></windows.h>
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!
喜欢 | 1
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号