我有一个简单的应用程序,它将.ini文件中的数据读入记录,然后执行ShellExecute。但是,当我在调试模式下运行它时,它告诉我真正的空闲堆不应该是它应该是:
“True heap size:688128,True free heap:688016,should:688128”
只有当我实际运行ShellExecute时才会发生这种情况(但是即使我没有运行ShellExecute,我得到一个688016的True自由堆,但没有抱怨它应该是688128),所以我想知道我是否需要释放PChar()
转换(不应该是我读过的所有内容),或者ShellExecute返回的句柄(尽管CloseHandle(ShellHandle);
不会改变)消息),或者它是否是预期的行为?
有问题的IniSettings.SetupCommand
是一个触发UAC提示的.msi文件,但我真的只想让它成为Fire& amp;忘记了,因为我的Lazarus应用程序并不关心它发布的内容。
供参考,这是我的整个单位。我正在使用Lazarus 1.6.2,FPC 3.0.0,i386-win32,而我只针对Windows。我的调试设置位于代码之后的最底层。
unit MainUnit;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls,
Graphics, Dialogs, StdCtrls, IniFiles, Windows;
type
{ IniSettings }
TAutorunIniSettings = record
AutorunTitle: AnsiString;
SetupCommand: AnsiString;
end;
{ TMainForm }
TMainForm = class(TForm)
btnSetup: TButton;
lblTitle: TLabel;
procedure btnSetupClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
IniSettings: TAutorunIniSettings;
public
{ public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.lfm}
{ TMainForm }
procedure TMainForm.FormCreate(Sender: TObject);
var
AutorunIni: TIniFile;
begin
try
AutorunIni := TIniFile.Create('Autorun.ini');
IniSettings.AutorunTitle := AutorunIni.ReadString('Autorun', 'Title', 'Autorun');
IniSettings.SetupCommand := AutorunIni.ReadString('Autorun', 'Setup', '');
self.Caption := IniSettings.AutorunTitle;
finally
if(AutorunIni <> nil) then AutorunIni.Free;
end;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
end;
procedure TMainForm.btnSetupClick(Sender: TObject);
begin
ShellExecute(0, 'open', PChar(IniSettings.SetupCommand), nil, nil, SW_SHOWNORMAL);
end;
end.