程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 四種方法實現VC枚舉系統當前進程

四種方法實現VC枚舉系統當前進程

編輯:vc教程

在Windows 2000以上的MS操作系統,通過Windows的任務管理器可以列出當前系統的所有活動進程(如圖1所示),在Windows XP中,更是在控制台下增加了一條Tasklist命令,讓系統下的所有進程無所遁行(如圖2所示)。這一切是怎麼實現的呢?

引用侯捷大師在《深入淺出MFC》的一句話,“知其然而不知其所以然,真不是個好辦法”。既然如此,我們干脆自己動手,自己通過編程來實現吧,這樣很有成就感哦!以下所有代碼均在Windows XP SP1+VC6.0 sp6編譯環境下通過。Ok,Let’ go!

方法一

第一種方法是大家比較熟悉的通過ToolHelp Service提供的API函數來實現。這裡用到了3個關鍵的函數:CreateToolhelp32Snapshot(),Process32First()和Process32Next()。下面給出了關於這三個函數的原形和參數說明;

HANDLE WINAPI CreateToolhelp32Snapshot(
DWord dwFlags, //系統快照要查看的信息類型
DWord th32ProcessID //值0表示當前進程
);
BOOL WINAPI Process32First(
HANDLE hSnapshot, //CreateToolhelp32Snapshot()創建的快照句柄
LPPROCESSENTRY32 lppe //指向進程入口結構
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot, //這裡參數同Process32First
LPPROCESSENTRY32 lppe //同上
);

首先使用CreateToolhelp32Snapshot()創建系統快照句柄(hprocess是我們聲明用來保存創建的快照句柄):

hProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
然後調用Process32First()獲得系統快照中的第一個進程信息(Report是BOOL型作為判斷系統快照中下一條進程記錄):

report=Process32First(hProcess,pinfo);
接著用一個循環調用來遍歷系統中所有運行的進程:

while(report)
{
hModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pinfo->th32ProcessID);
Module32First(hModule, minfo);
GetShortPathName(minfo->szExePath,shortpath,256);
printf("%s --- %s ",pinfo->szExeFile,shortpath);
report=Process32Next(hProcess, pinfo);
}

筆者曾通過對Pstools工具包裡的Pslist.exe反編譯,發現該工具用的就是這種方法。如果你查詢MSDN,可以找到一個比這個功能更加完善的源程序。

方法二

第二種方法也很常見,通過MSDN就可以找到例子代碼,它是通過Psapi.dll提供的API函數EnumProcesses和EnumProcessModules來實現。有一點要說明的是,Visual Studio提供的SDK包裡沒有提供相應的Psapi.h和與之相對應的導入庫,筆者當時就很納悶,MSDN裡的例子居然編譯不通,後來才發現,編譯時根本找不到“psapi.h”。呵呵,還好,MSDN至少告訴我們他們都包含Psapi.dll裡,用VC自帶的Depend工具一查,果然。這樣就好辦了,我們可以自己找到這些函數入口地址。

小知識:C也好C++也好,一般的函數名本質上都是一個地址,在Win32的API裡,它是指向函數所在Dll模塊裡函數實現的入口地址。

下面是第二種方法的實現過程:首先,先把Psapi.dll裡要用到函數都定義好,方便後面顯示調用。

//在psaipi.dll中的函數EnumProcesses用來枚舉進程
typedef BOOL (_stdcall *ENUMPROCESSES)( //注意這裡要指明調用約定為-stdcall
DWord* pProcessIds, //指向進程ID數組鏈
DWord cb, //ID數組的大小,用字節計數
DWord* pBytesReturned); //返回的字節
//在psapi.dll中的函數EnumProcessModules用來枚舉進程模塊
typedef BOOL (_stdcall *ENUMPROCESSMODULES)(
HANDLE hProcess, //進程句柄
HMODULE* lphModule, //指向模塊句柄數組鏈
DWord cb, //模塊句柄數組大小,字節計數
LPDWord lpcbNeeded); //存儲所有模塊句柄所需的字節數
//在psapi.dll中的函數GetModuleFileNameEx獲得進程模塊名
typedef DWord (_stdcall *GETMODULEFILENAMEEX)(
HANDLE hProcess, //進程句柄
HMODULE hModule, //進程句柄
LPTSTR lpFilename, //存放模塊全路徑名
D

[1] [2] [3] [4] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved