在ShellExecute

时间:2016-12-28 15:13:49

标签: lazarus freepascal

我有一个简单的应用程序,它将.ini文件中的数据读入记录,然后执行ShellExecute。但是,当我在调试模式下运行它时,它告诉我真正的空闲堆不应该是它应该是:

  

“True heap size:688128,True free heap:688016,should:688128”

Heaptrc message

只有当我实际运行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.

Lazarus Debug Settings

0 个答案:

没有答案