VirtualAlloc详细说明请参考:http://baike.baidu.com/view/1521481.htm?fr=ala0_1_1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TStruct = packed record
SysAutoID: integer;
Text: string[10];
StkID: string[20];
end;
PTStructArray = ^TStructArray;
TStructArray = array[0..1000] of TStruct;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
FPArray :PTStructArray;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i :Integer;
begin
FPArray := Windows.VirtualAlloc(nil, 10 * SizeOf(TStruct), MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);//分配10个大小
for i := 0 to 9 do
begin
FPArray^[i].SysAutoID := i;
FPArray^[i].Text := 'Text' + IntToStr(i);
FPArray^[i].StkID := 'STKID' + IntToStr(i);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i :Integer;
begin
Windows.VirtualAlloc(FPArray, 12 * SizeOf(TStruct), MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
//在原基础上再分配2个大小,原来内存的内容不变
for i := 10 to 11 do
begin
FPArray^[i].SysAutoID := i;
FPArray^[i].Text := 'Text' + IntToStr(i);
FPArray^[i].StkID := 'STKID' + IntToStr(i);
end;
Memo1.Clear;
for i := 0 to 11 do
Memo1.Lines.Add(IntToStr(FPArray^[i].SysAutoID) + ' ' + FPArray^[i].Text + ' ' + FPArray^[i].StkID);
Windows.VirtualFree(FPArray, 0, MEM_RELEASE); //释放内存
end;
end.