Inno setup 从Inno设置中的过程调用函数?

Inno setup 从Inno设置中的过程调用函数?,inno-setup,pascal,Inno Setup,Pascal,我试图在Inno安装程序退出之前检查我刚刚安装的服务是否正在运行。我需要在之后执行一个程序,所以我试图调用一个过程,该过程在运行参数中使用BeforeInstall中的函数 我从另一篇文章中找到了这个例子,我试图对它进行修改,以检查我的服务是否在安装之后但在运行行执行之前运行。我是pascal新手,似乎不知道如何从过程中调用函数。任何帮助都将不胜感激。谢谢 [Run] ; Launch the Setup App here Filename: "{app}\MyApp.exe"; BeforeI

我试图在Inno安装程序退出之前检查我刚刚安装的服务是否正在运行。我需要在之后执行一个程序,所以我试图调用一个过程,该过程在运行参数中使用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;

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

你还有第二个问题(这在你的问题中并不明显)。过程没有函数所具有的预定义的
Result
变量,因为过程没有结果。您还需要在
AfterInstallProc
过程中声明一个局部变量,以避免
变量“Result”未声明的错误

[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;

我觉得你的代码很好,除了你提到你想在安装之前做一些事情,你的代码在
AfterInstall
过程中(安装之后执行,因此命名为AfterInstall)。您对此有什么具体问题?我在此行的IsAppRunning上遇到未知标识符错误:result:=not IsAppRunning('MyService.exe');这些信息应该在你的问题中,这样我就不用问了。以后要记住这一点。:-)如果你不告诉我们问题是什么,我们就不知道——我们坐在那里看不到你的屏幕。提供您已有的详细信息使我们能够更轻松地提供帮助,并使您更快地获得帮助。感谢您的帮助。不过我还是有个错误。此行上的未知标识符“result”:result:=not IsAppRunning('MyService.exe')<代码>结果
仅为函数而不是过程预定义。一秒钟。是的,这是我最纠结的错误。我尝试添加一个全局变量,但它一直告诉我它是重复的。请参阅我的编辑。我要求了一秒钟,不是吗?:-)您没有给我。因此,请将变量命名为
Result
以外的其他名称。试试
Res
。它在您发布的任何代码中都不是重复的,所以它可能是您在某个地方做的其他事情(比如您的全局声明尝试)。