EnumProcesses

  EnumProcesses

BOOL EnumProcesses( DWORD *lpidProcess, DWORD cb, DWORD *cbNeeded );

EnumProcesses()带三个参数,DWORD 类型的数组指针 lpidProcess;该数组的大小尺寸 cb;以及一个指向 DWORD 的指针 cbNeeded,它接收返回数据的长度。DWORD 数组用于保存当前运行的进程 IDs。cbNeeded 返回数组所用的内存大小。下面算式可以得出返回了多少进程:nReturned = cbNeeded / sizeof(DWORD)。
注意:虽然文档将返回的 DWORD 命名为“cbNeeded”,实际上是没有办法知道到底要传多大的数组的。EnumProcesses()根本不会在 cbNeeded 中返回一个大于 cb 参数传递的数组值。结果,唯一确保 EnumProcesses()函数成功的方法是分配一个 DWORD 数组,并且,如果返回的 cbNeeded 等于 cb,分配一个较大的数组,并不停地尝试直到 cbNeeded 小于 cb
现在,你获得了一个数组,其元素保存着系统中每个进程的ID。如果你要想获取进程名,那么你必须首先获取一个句柄。要想从进程 ID 得到句柄,就得调用 OpenProcess(),一旦有了句柄,则需要得到该进程的第一个模块。这只是题外话,今天不讨论获取进程名。

现来看怎样获取现在系统所有的进程PID(VB版)

Private  Declare  Function  EnumProcesses Lib  " PSAPI.DLL "  (ByRef lpidProcess  As   Long , ByVal cb  As   Long , ByRef cbNeeded  As   Long As   Long

Private   Sub  Command1_Click()
    
Const  clMaxNumProcesses  As   Long   =   5000   ' 最大进程数
     Const  MAX_PATH  =   260
    
Const  PROCESS_QUERY_INFORMATION  =   1024
    
Const  PROCESS_VM_READ  =   16
    
Dim  strModuleName  As   String   *  MAX_PATH
    
Dim  strProcessNamePath  As   String
    
Dim  strProcessName  As   String
    
Dim  allMatchingProcessIDs()  As   Long
    
Dim  alModules( 1   To   400 As   Long
    
Dim  lBytesReturned  As   Long
    
Dim  lNumMatching  As   Long
    
Dim  lNumProcesses  As   Long
    
Dim  lBytesNeeded  As   Long
    
Dim  alProcIDs()  As   Long
    
Dim  lHwndProcess  As   Long
    
Dim  lThisProcess  As   Long
    
Dim  lRet  As   Long
    
    
    
    
    
ReDim  alProcIDs(clMaxNumProcesses  *   4 As   Long   ' ??5000*4
    lRet  =  EnumProcesses(alProcIDs( 1 ), clMaxNumProcesses  *   4 , lBytesReturned)
    lNumProcesses 
=  lBytesReturned  /   4
    
ReDim  Preserve alProcIDs(lNumProcesses)  ' 获取所有进程的标识符
     Dim  i  As   Integer
    
For  i  =   1   To  lNumProcesses
    Debug.Print alProcIDs(i)
    
Next  i
    
End Sub

我看了下专家caimouse的blog写的C++代码。(C++版)

当你开发的软件在用户那里运行出错了,想怎么办呢?当然是希望把出错时候的运行环境信息生成报表,然后再Email回来查看了。这里就介绍一个函数可以把当时运行环境的进程全部找到,然后可以输出每个进程的信息。当然,这个函数也可以使用到杀病毒软件里,用来查看可疑的进程信息。
 
函数EnumProcesses声明如下:
 
BOOL
WINAPI
EnumProcesses (
    DWORD 
*  lpidProcess ,
    DWORD   cb
,
    DWORD 
*  cbNeeded
    );
lpidProcess是保存进程ID的数组。
cb是进程组数的大小。
cbNeeded是返回进程数组的大小。
 
调用函数的例子如下:
# 001 //获取系统所有进程。
#
002  //蔡军生 2007/12/12 QQ:9073204 深圳
#
003  void TestEnumProcesses(void)
#
004  {
#
005         //
#
006         const int nBufSize = 512;
#
007         TCHAR chBuf[nBufSize];
#
008         ZeroMemory(chBuf,nBufSize);
#
009 
#
010         //
#
011         DWORD dwProcs[1024*2];
#
012         DWORD dwNeeded;
#
013 
#
014         //枚举所有进程ID。
#
015        if ( !EnumProcesses( dwProcs, sizeof(dwProcs), &dwNeeded ) )
#
016         {
#
017               //输出出错信息。
#
018               wsprintf(chBuf,_T("EnumProcesses failed (%d). "), GetLastError() );
#
019               OutputDebugString(chBuf);
#
020 
#
021               return;
#
022         }    
#
023 
#
024         // 计算有多少个进程ID。
#
025         DWORD dwProcCount = dwNeeded / sizeof(DWORD);
#
026         
#
027         wsprintf(chBuf,_T("EnumProcesses Count(%d). "), dwProcCount );
#
028         OutputDebugString(chBuf);
#
029 
#
030  }
#
031 

 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值