指针的使用(一个内存老虎的程序,请大家来帮忙让老虎变小猫,请大侠们一定要进来看看(200分)

  • 主题发起人 主题发起人 PowerDelphi
  • 开始时间 开始时间
P

PowerDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一段程序不知错在什么地方,我在implementation部分声明了如下类型:
type
TProcessInfo=Record
ExeFile:string;
ProcessID:DWORD;
end;
PProcessInfo=^TProcessInfo;
然后有以下过程:
procedure TForm1.Timer1Timer(Sender: TObject);//Timer1.interval:=1000
var
p:PProcessInfo;
i:integer;
ContinueLoop:Boolean;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
hh:HWND;
begin
FSnapshotHandle:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize :=SizeOf(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
new(p);
p.ExeFile :=FProcessEntry32.szExeFile
i:=checklistbox1.Items.IndexOf(lowercase(extractfilename(p.ExeFile)));
if i>=0 then
begin
p.ProcessID :=FProcessEntry32.th32ProcessID
hh:=OpenProcess(PROCESS_ALL_ACCESS,true,p.ProcessID);
TerminateProcess(hh,0);
application.MessageBox ('此程序被禁止在本机运行,请与管理员联系!','禁止运行 ',MB_ICONINFORMATION+MB_OK);
end;
Dispose(p);
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
这个程序运行达到了我的目的:根据程序来关闭要想关闭的程序,但是一个非常严重的问题产生了:内存的使用太惊人了。开始我运行这个程序前可用物理内存是
116MB(RamIdle测得),这是退出RamIdle改用WindowsMe自带的“系统监视器”继续监测可用物理内存,大约5分钟过后,可用物理内存变为91.2MB,这时退出这个程序,可用物理内存又突增至116MB(系统监视器测得),过一会儿后又增至116.2MB后来一直稳定在116MB这个水平没有变化。我明明是new(p)后又Dispose(p)不知我错在什么地方,怎样才能避免这种情况,请大侠们指点迷津。不盛感激!!!
 
把 ExeFile 改成长度固定的串试一试
 
呵,又开了一个?
 
最后要加一句: CloseHandle(FSnapshotHandle);
不懂你为什么要用指针。 直接P: TProcessInfo;不就行了?不过这一部份是没有问题的。
另外
hh:=OpenProcess(PROCESS_ALL_ACCESS,true,p.ProcessID);
TerminateProcess(hh,0);
这两句后面不知还要不要加CloseHandle(hh)
如果不是TerminateProcess的话,那是必然的
但是TerminateProcess之后还要不要加就不知道了,你可以试一下,如果加上去不出错就加吧。
 
type
TProcessInfo = record
ExeFile: string;
ProcessID: DWORD;
end;

procedure TForm1.Timer1Timer(Sender: TObject)
//Timer1.interval:=1000
var
p: TProcessInfo;
i: integer;
ContinueLoop: Boolean;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
hh: HWND;
begin
FSnapshotHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
p.ExeFile := FProcessEntry32.szExeFile;
i := checklistbox1.Items.IndexOf(lowercase(extractfilename(p.ExeFile)));
if i >= 0 then
begin
p.ProcessID := FProcessEntry32.th32ProcessID;
hh := OpenProcess(PROCESS_ALL_ACCESS, true, p.ProcessID);
try
TerminateProcess(hh, 0);
Application.MessageBox('此程序被禁止在本机运行,请与管理员联系!', '禁止运行',
MB_ICONINFORMATION + MB_OK);
finally
CloseHandle(hh);
end;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
finally
CloseHandle(FSnapshotHandle);
end;
end;
 
你是想访问进程的内存空间,对吗?
同意楼上的,在ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);一句后
要加上CloseHandle(FSnapshotHandle);关键就在这里。
TerminateProcess(hh,0);一句没问题。不需要加CloseHandle(hh)

可以用FreeMem(p.ProcessID);试试!
另外一个小瑕疵:integer(ContinueLoop)<>0 可以直接写为 ContinueLoop<>0
 
我认为CloseHandle(FSnapshotHandle)和CloseHandle(hh)都是非常必须的,这两句都需要。
另外,我觉得你那个变量P非常无聊,直接定义两个ExeName、PID不更简单吗?
 
问题基本搞定,
想请问各位大侠“指针”和“句柄”是不是一样(WINDOWS下的“句柄”是不是相当于DOS下的“指针”),
两者有何区别?它们各自的作用究意是什么?,我对这个问题困惑己久,查了一些资料还是搞不懂,
在使用它们编程时应注意什么些问题,盼望大家说的详细一点,求知心切,恳请大家帮帮忙!!!
 
句柄是指向一块内存区域的指针
这块内存区域保存了窗口的信息
指针是什么应该不用说了吧? 很多书都说得很明白的。
 
你可以看看这篇文章:http://www.csdn.net/develop/article%5C10%5C10650.shtm以及相关的讨论
另外建议你读一读<WINDOWS核心编程>,绝对值得一看!
 
个人认为指针和句柄在本质上都是一样的,都只是一个整数值而已。
 
句柄是指针吗?
本人持怀疑态度。
我认为句柄是windows的一种编号方法!
 
让我来开坛讲解一番,以清世人耳目。呵呵!
句柄是什么?呵呵!就是无类型指针,说得通俗点就是一个32位数据类型。两者的表现都是整数值。
在16位下,句柄只是一个对象的代号;而32位下,句柄就是对象的地址了。
总而言之,句柄就是一个指针,尽管它没有指向用于存储某个对象的内存位置,然而事实上,它的指向
包括了对那个对象进行引用的位置。我们常常说句柄的引用,而引用就是指针,它可以指向变量、数组、
哈希表甚至子程序。
指针是什么?指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 而对这个地址
的引用就是句柄。
我想现在大家都该大彻大悟了吧!如果是的话,在下觉得功莫大矣。
 
多人接受答案了。
 
后退
顶部