本例在建立一個新的堆前後分別通過 GetProcessHeaps 函數擷取了當前進程的堆控制代碼列表, 沒想到一個最簡單的程式也有 5 個堆.
:
unit Unit1;interfaceuses 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;end.