我这样做有错吗?
unit UMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TProcessStruct=Record
ProcId:THandle;
ProcName:String;
End;
TDowrdPoint=^DWord;
TInteger=Array [1..2000] Of dword;
TFun=Function (ProcessId:TInteger;Cb:dword;CbNeeded:dword):Boolean;Stdcall;//获得进程句柄
TGetModuleFileNameEx=Function(hProcess:Dword;hModule:LongWord;lpFilename:LPSTR;nSize:DWORD):DWord;Stdcall;//获得模块句柄
TEnumProcessModules=Function ( hProcess:Dword;lphModule:TInteger;cb:DWORD;lpcbNeeded:LPDWORD):BOOLean;Stdcall;//获得模块文件名
TIdProcess=Record//进程id记录结构
Arr:TInteger;
OneHandle:THandLe;
ArrSize:DWord;
End;
TNameProcess=Record //进程名和模块id记录结构
hProcess:DWord; //进程id。
lphModule:Array [1..2000] Of DWord;
lpFilename:LPSTR;
nSize:DWORD;
End;
TModule=Record //枚举进程模块用到的记录结构。
hProcess:DWord; //进程id。
lphModule:HMODULE;//模块句柄!
cb:DWord; //数组大小!
lpcbNeeded:LPDWORD;//存放文件名的字符串变量
nSize:DWORD;//字符串大小!
End;
var
Form1: TForm1;
VPStruct:TProcessStruct;
EnumProcesses:TFun;
GetModuleFileNameEx:TGetModuleFileNameEx;
EnumProcessModules:TEnumProcessModules;
{$R *.dfm}
implementation
procedure TForm1.Button1Click(Sender: TObject);
Var
Arr:TInteger;
OneHandle : THandle;
A:dword;
hProcess:Dword;
hModule:LongWord;
lpFilename:LPSTR;
nSize:DWORD;
lphModule:TInteger;
cb:DWORD;
lpcbNeeded:LPDWORD;
Begin
lpFileName:=' ';
OneHandle:=LoadLibrary('E:\My\DLLInformation\Psapi.dll');
If OneHandle<>0 Then
Begin
@EnumProcesses:=GetProcAddRess(OneHandle,'EnumProcesses');
If NOt (@EnumProcesses=Nil) Then
EnumProcesses(Arr,SizeOf(Arr),a);
@EnumProcessModules:=GetProcAddRess(OneHandle,'EnumProcessModules');
If Not (@EnumProcessModules=Nil) Then
Begin
cb:=SizeOf(lphModule);
EnumProcessModules(Arr[1],lphModule,Cb,lpcbNeeded);
End
Else
Begin
ShowMessage('调用枚举进程模块失败!');
Exit;
End;
@GetModuleFileNameEx:=GetProcAddRess(OneHandle,'GetModuleFileNameExW');
If Not (@GetModuleFileNameEx=Nil) Then
Begin
nSize:=SizeOf(lpFileName);
Memo1.Lines.Add(IntToStr(lphModule[1]));
GetModulefileNameEx(Arr[1],lphModule[1],lpFilename,nSize);
End;
End;
end;
end.
运行后出现这样的提示:
Project PMain.exe raised exception class EAccessViolation with
message' Access violation at address 00434949 in module '
PMain.exe'.Read of Address 00000074'.
跟踪的知道是运行到时候出错了!:
If Not (@GetModuleFileNameEx=Nil) Then
Begin
nSize:=SizeOf(lpFileName);
Memo1.Lines.Add(IntToStr(lphModule[1]));
GetModulefileNameEx(Arr[1],lphModule[1],lpFilename,nSize);
End;
各位大虾请赐教呀!
我的问题很简单,在内存中找到特定的进程(根据程序的名称来查找),然后杀掉这个进
程。请问有更好的方法吗?