有这里有一段代码,是在SpeedButton里执行的轮循操作,没有问题:
================================================
unit MainFrm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, TLHelp32, ComCtrls, ExtCtrls, Buttons, ImgList;const
PROCESS_TERMINATE=$0001;
type
TfrmMain = class(TForm)
lsvProcess: TListView;
pnlMain: TPanel;
stsMessage: TStatusBar;
lsiLargeIcon: TImageList;
lsiSmallIcon: TImageList;
spdLargeIcon: TSpeedButton;
spdSmallIcon: TSpeedButton;
spdList: TSpeedButton;
spdReport: TSpeedButton;
spdRefresh: TSpeedButton;
procedure spdLargeIconClick(Sender: TObject);
procedure spdSmallIconClick(Sender: TObject);
procedure spdListClick(Sender: TObject);
procedure spdReportClick(Sender: TObject);
procedure spdRefreshClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lsvProcessDblClick(Sender: TObject);
private
{ Private declarations }
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
procedure DisplayHint(Sender: TObject);
public
{ Public declarations }
end;var
frmMain: TfrmMain;implementation{$R *.DFM}procedure TfrmMain.DisplayHint(Sender: TObject);
begin
stsMessage.SimpleText := Application.Hint;
end;procedure TfrmMain.spdLargeIconClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsIcon;
end;procedure TfrmMain.spdSmallIconClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsSmallIcon;
end;procedure TfrmMain.spdListClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsList;
end;procedure TfrmMain.spdReportClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsReport;
end;procedure TfrmMain.spdRefreshClick(Sender: TObject);
var
i:integer;
ContinueLoop:BOOL;
NewItem : TListItem;
begin
lsvProcess.Items.Clear;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
NewItem:=lsvProcess.Items.add;
NewItem.Caption:=ExtractFileName(FProcessEntry32.szExeFile);
NewItem.subItems.Add(IntToHex(FProcessEntry32.th32ProcessID,4));
NewItem.subItems.Add(FProcessEntry32.szExeFile);
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;procedure TfrmMain.FormCreate(Sender: TObject);
begin
Application.OnHint := DisplayHint;
spdRefreshClick(Sender);
end;procedure TfrmMain.lsvProcessDblClick(Sender: TObject);
var
Ret : BOOL;
ProcessID : integer;
ProcessHndle : THandle;
begin
try
with lsvProcess do
begin
if MessageDlg('Do You Want To Terminate "'+ItemFocused.Caption+'"?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
begin
ProcessID:=StrToInt('$'+ItemFocused.SubItems[0]);
ProcessHndle:=OpenProcess(PROCESS_TERMINATE,BOOL(0),ProcessID);
Ret:=TerminateProcess(ProcessHndle,0);
if Integer(Ret)=0 Then
MessageDlg('Can Not Terminate "'+ItemFocused.Caption+'"',mtInformation,[mbOk],0)
else
ItemFocused.Delete;
end;
end;
except
end;
end;end.
================================================
unit MainFrm;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, TLHelp32, ComCtrls, ExtCtrls, Buttons, ImgList;const
PROCESS_TERMINATE=$0001;
type
TfrmMain = class(TForm)
lsvProcess: TListView;
pnlMain: TPanel;
stsMessage: TStatusBar;
lsiLargeIcon: TImageList;
lsiSmallIcon: TImageList;
spdLargeIcon: TSpeedButton;
spdSmallIcon: TSpeedButton;
spdList: TSpeedButton;
spdReport: TSpeedButton;
spdRefresh: TSpeedButton;
procedure spdLargeIconClick(Sender: TObject);
procedure spdSmallIconClick(Sender: TObject);
procedure spdListClick(Sender: TObject);
procedure spdReportClick(Sender: TObject);
procedure spdRefreshClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure lsvProcessDblClick(Sender: TObject);
private
{ Private declarations }
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
procedure DisplayHint(Sender: TObject);
public
{ Public declarations }
end;var
frmMain: TfrmMain;implementation{$R *.DFM}procedure TfrmMain.DisplayHint(Sender: TObject);
begin
stsMessage.SimpleText := Application.Hint;
end;procedure TfrmMain.spdLargeIconClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsIcon;
end;procedure TfrmMain.spdSmallIconClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsSmallIcon;
end;procedure TfrmMain.spdListClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsList;
end;procedure TfrmMain.spdReportClick(Sender: TObject);
begin
lsvProcess.ViewStyle:=vsReport;
end;procedure TfrmMain.spdRefreshClick(Sender: TObject);
var
i:integer;
ContinueLoop:BOOL;
NewItem : TListItem;
begin
lsvProcess.Items.Clear;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
NewItem:=lsvProcess.Items.add;
NewItem.Caption:=ExtractFileName(FProcessEntry32.szExeFile);
NewItem.subItems.Add(IntToHex(FProcessEntry32.th32ProcessID,4));
NewItem.subItems.Add(FProcessEntry32.szExeFile);
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;procedure TfrmMain.FormCreate(Sender: TObject);
begin
Application.OnHint := DisplayHint;
spdRefreshClick(Sender);
end;procedure TfrmMain.lsvProcessDblClick(Sender: TObject);
var
Ret : BOOL;
ProcessID : integer;
ProcessHndle : THandle;
begin
try
with lsvProcess do
begin
if MessageDlg('Do You Want To Terminate "'+ItemFocused.Caption+'"?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
begin
ProcessID:=StrToInt('$'+ItemFocused.SubItems[0]);
ProcessHndle:=OpenProcess(PROCESS_TERMINATE,BOOL(0),ProcessID);
Ret:=TerminateProcess(ProcessHndle,0);
if Integer(Ret)=0 Then
MessageDlg('Can Not Terminate "'+ItemFocused.Caption+'"',mtInformation,[mbOk],0)
else
ItemFocused.Delete;
end;
end;
except
end;
end;end.
解决方案 »
- DElphi7做的闹钟怎么打包??急!!!!
- 用delphi将数据库中部分内容导出的问题
- rtl60.bpl错误问题
- 如何通过程序为windows创建用户,授与权限,共享文件夹?
- 全文搜索不能用,怎样做防火墙程序?
- Invalid pointer operation
- 请问哪里有 delphi 的编程百例源码可下载
- 关于D5所做的程序在D6中的编译的问题!
- procedure InsertText(AHandle: THandle); far;~ 关键字 FAR 什么意思?
- 请问中国移动的“1861”谁知道怎样实现的,pc+modem能否实现。
- 用Delphi好吗?
- 如何在程序中调出ADO数据库访问向导?
HANDLE hSnapshot //
由 CreateToolhelp32Snapshot 返回
的系统快照句柄;
LPPROCESSENTRY32 lppe // 指向一个 PROCESSENTRY32 结构;
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot // 由 CreateToolhelp32Snapshot 返回
的系统快照句柄;
LPPROCESSENTRY32 lppe // 指向一个 PROCESSENTRY32 结构;
);
hSnapshot 由 CreateToolhelp32Snapshot 返回的系统快照句柄;
CreateToolhelp32Snapshot 原形如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, // 快照标志;
DWORD th32ProcessID // 进程ID;
);
现在需要的是进程的信息,所以将 dwFlags
指定为 TH32CS_SNAPPROCESS,
th32ProcessID 忽略;PROCESSENTRY32 结构如下:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; // 结构大小;
DWORD cntUsage; // 此进程的引用计数;
DWORD th32ProcessID; // 进程ID;
DWORD th32DefaultHeapID; // 进程默认堆ID;
DWORD th32ModuleID; // 进程模块ID;
DWORD cntThreads; // 此进程开启的线程计数;
DWORD th32ParentProcessID;// 父进程ID;
LONG pcPriClassBase; // 线程优先权;
DWORD dwFlags; // 保留;
char szExeFile[MAX_PATH]; // 进程全名;
} PROCESSENTRY32;
---- 至此,所用到的主要函数已介绍完,实现读内存只要从下到上依次调用上述函数即可,具体参见原代码:
procedure TForm1.Button1Click(Sender: TObject);
var
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
Ret : BOOL;
ProcessID : integer;
ProcessHndle : THandle;
lpBuffer:pByte;
nSize: DWORD;
lpNumberOfBytesRead: DWORD;
i:integer;
s:string;
begin
FSnapshotHandle:=CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS,0);
//创建系统快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
//先初始化 FProcessEntry32 的大小
Ret:=Process32First(FSnapshotHandle,FProcessEntry32);
while Ret do
begin
s:=ExtractFileName(FProcessEntry32.szExeFile);
if s='KERNEL32.DLL' then
begin
ProcessID:=FProcessEntry32.th32ProcessID;
s:='';
break;
end;
Ret:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
//循环枚举出系统开启的所有进程,找出"Kernel32.dll"
CloseHandle(FSnapshotHandle);
Memo1.Lines.Clear ;
memo1.lines.add('Process ID '+IntToHex(
FProcessEntry32.th32ProcessID,8));
memo1.lines.Add('File name '+FProcessEntry32.szExeFile);
////输出进程的一些信息
nSize:=4;
lpBuffer:=AllocMem(nSize);
ProcessHndle:=OpenProcess(PROCESS_VM_READ,false,ProcessID);
memo1.Lines.Add ('Process Handle '+intTohex(ProcessHndle,8));
for i:=$00800001 to $0080005f do
begin
ReadProcessMemory(
ProcessHndle,
Pointer(i),
lpBuffer,
nSize,
lpNumberOfBytesRead
);
s:=s+intTohex(lpBuffer^,2)+' ';
//读取内容
if (i mod 16) =0 then
begin
Memo1.Lines.Add(s);
s:='';
end;
//格式化输出
end;
FreeMem(lpBuffer,nSize);
CloseHandle(ProcessHndle);
//关闭句柄,释放内存
end;