uses tlhelp32;
procedure TForm1.Button1Click(Sender: TObject);
var
pe
![Stick Out Tongue :P :P](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f61b.png)
ROCESSENTRY32;
me:MODULEENTRY32;
hp,hm:Thandle;
b,b1:boolean;
begin
hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
b:=Process32First(hp,pe);
while b do
begin
hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);
me.dwSize:=sizeof(ModuleEntry32);
if Module32First(hm,me) then
begin
b1:=Module32First(hm,me);
while b1 do
begin
if me.th32ModuleID=pe.th32ModuleID then
listbox1.Items.Add(me.szExePath);
b1:=Module32Next(hm,me);
end;
end;
b:=Process32Next(hp,pe);
end;
end;
--------------------------------------------------------------------------------
toolhelp api 在 nt 上不支持
下面的可以在 nt 上运行
如果要copy到其他机上运行,要顺便拷贝 psapi.dll(这个dll安装delphi或者c++ builder后就有了)
#include "psapi.hpp"
假使process id是 pid 的话:
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pid);
if( NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
{
char buf[MAX_PATH+1]="";
if(GetModuleBaseName( hProcess, hMod,buf,sizeof buf)>0)
//
// buf放的就是名字
//
}
CloseHandle(hProcess);
}
--------------------------------------------------------------------------------
找出所有进程的 process id:
下面的程序也是可以在 nt 上运行:
下面的程序也是需要 psapi.dll
#include "psapi.hpp"
DWORD pid[1000];
DWORD ret_id=0;
if(!EnumProcesses(pid,sizeof pid,&ret_id))
//返回0,就是失败了
成功的话返回 非 0 值
ret_id是返回的字节数,注意不是id的个数,
比如返回 1 个id,实际上ret_id等于4,(表示4个字节)
ret_id/4 才是 返回 的id 的个数
返回的id放在 数组 pid
大小要大于 id 可能的最大数才找的全,上面的例子是可以找1000个,足够了,
如果嫌大,200个就可以了
xp同nt