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
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
函数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