从 Inno Setup 中的过程调用函数?

rax*_*mus 4 pascal inno-setup

我正在尝试在退出 Inno Setup 之前检查我刚刚安装的服务是否正在运行。我需要紧接着执行一个程序,所以我试图调用一个过程,该过程在运行参数中使用来自 BeforeInstall 的函数。

我从另一篇文章中找到了这个示例,我正在尝试更改它以检查我的服务是否在安装后但在运行行执行之前运行。我是 pascal 的新手,我似乎无法弄清楚如何从过程中调用该函数。任何帮助,将不胜感激。谢谢!

[Run]
; Launch the Setup App here
Filename: "{app}\MyApp.exe"; BeforeInstall: AfterInstallProc

[Code]
procedure AfterInstallProc;
begin
  result := not IsAppRunning('MyService.exe');
  if not result then
    MsgBox('Error message here', mbError, MB_OK);
end;

function IsAppRunning(const FileName : string): Boolean;
var
  FSWbemLocator: Variant;
  FWMIService : Variant;
  FWbemObjectSet: Variant;
begin
  Result := false;
  FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
  FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
  Result := (FWbemObjectSet.Count > 0);
  FWbemObjectSet := Unassigned;
  FWMIService := Unassigned;
  FSWbemLocator := Unassigned;
end;
Run Code Online (Sandbox Code Playgroud)

Ken*_*ite 6

您需要更改代码的排列,以便IsAppRunningAfterInstall尝试使用它之前知道它 - 否则编译器不知道它在那里。(它不会向前看,但 Delphi 的编译器也不会。)

您还有第二个问题(从您的问题中看不出来)。过程没有Result函数那样的预定义变量,因为过程没有结果。您还需要在您的AfterInstallProc过程中声明一个局部变量以避免variable "Result" is not declared错误。

[Run]
; Launch the Setup App here
Filename: "{app}\MyApp.exe"; BeforeInstall: AfterInstallProc

[Code]
function IsAppRunning(const FileName : string): Boolean;
var
  FSWbemLocator: Variant;
  FWMIService : Variant;
  FWbemObjectSet: Variant;
begin
  Result := false;
  FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
  FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
  Result := (FWbemObjectSet.Count > 0);
  FWbemObjectSet := Unassigned;
  FWMIService := Unassigned;
  FSWbemLocator := Unassigned;
end;

procedure AfterInstallProc;
var 
  Result: Boolean;
begin
  Result := not IsAppRunning('MyService.exe');
  if not Result then
    MsgBox('Error message here', mbError, MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)

  • `Result` 只是为函数预定义的,而不是过程。1秒。 (2认同)
  • 请参阅我的编辑。我问了一会儿,不是吗?:-) 你没有给我。 (2认同)
  • 因此,将变量命名为“Result”以外的其他名称。试试“Res”。它在您发布的任何代码中都不是重复的,因此它可能是您在某处做过的其他事情(例如您的全局声明尝试)。 (2认同)