本例在建立一個新的堆前後分別通過 GetProcessHeaps 函數獲取了當前進程的堆句柄列表, 沒想到一個最簡單的程序也有 5 個堆.
效果圖:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{把下面兩個過程公用的部分提取為一個獨立的過程}
procedure GetHeaps(List: TStrings);
var
HeapArr: array[0..9] of THandle; {對列表數組, 先假定有 10 堆}
n: Integer;
i: Integer;
begin
{獲取進程中的堆列表; 函數的參數1是數組大小, 參數2是數組的第一個元素, 返回堆的實際數量}
n := GetProcessHeaps(Length(HeapArr), HeapArr[0]);
List.Add(Format('當前進程共有 %d 個堆', [n]));
List.Add('它們的句柄分別是:');
for i := 0 to n - 1 do
List.Add(IntToStr(HeapArr[i]));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear;
{調用公用過程, 在 Memo1 中顯示堆句柄列表}
GetHeaps(Memo1.Lines);
{再次添加默認堆的句柄}
Memo1.Lines.Add('');
Memo1.Lines.Add('默認堆的句柄是:');
Memo1.Lines.Add(IntToStr(GetProcessHeap));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyHeap: THandle;
begin
{創建新堆}
MyHeap := HeapCreate(0, 1024*1024*2, 0); {建立個 2M 的堆}
Memo2.Clear;
{調用公用過程, 在 Memo2 中顯示堆句柄列表}
GetHeaps(Memo2.Lines);
{再次添加新建堆的句柄}
Memo2.Lines.Add('');
Memo2.Lines.Add('新建堆的句柄是:');
Memo2.Lines.Add(IntToStr(MyHeap));
{銷毀新建堆}
HeapDestroy(MyHeap);
end;