VC编程枚举进程
小标 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
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved