简体   繁体   English

我使用 inno setup 来检测是否安装了 .net 4.0 客户端,但它不能正常工作

[英]Im using inno setup to detect if .net 4.0 client installed but it doesn't work well

When I install my program it checks to see if the .net 4.0 client is installed.当我安装我的程序时,它会检查是否安装了 .net 4.0 客户端。

It not, then it should be installed.它不是,那么它应该被安装。

The problem is that if I run the setup program again the installation file is trying to install the .Net 4.0 client again but this time it is giving me the option to repair or remove the .Net 4.0 client.问题是,如果我再次运行安装程序,安装文件会尝试再次安装 .Net 4.0 客户端,但这次它让我可以选择修复或删除 .Net 4.0 客户端。

I don't know why in subsequent attempts it tries to install .Net again.我不知道为什么在随后的尝试中它会再次尝试安装 .Net。

Another problem is that in the [Run] section I'm running ffdshow to install it in silent mode how can I check if it is already installed so not to install it again?另一个问题是,在 [Run] 部分中,我正在运行 ffdshow 以静默模式安装它如何检查它是否已经安装,以便不再安装它?

Here is my script:这是我的脚本:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Lightnings Extractor"
#define MyAppVersion "Lightnings Extractor 1.0"
#define MyAppExeName "Lightnings Extractor.exe"
#define FfdshowExeName "

[_ISTool]
EnableISX=true


[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{E60E9193-B054-4026-98EA-5DAD45CE9B0B}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=D:\Lightnings_Extractor Setup
OutputBaseFilename=LE_Setup
SetupIconFile=D:\MyWeatherStation-Images-And-Icons\Weather_Michmoret.ico
Compression=lzma
SolidCompression=yes
PrivilegesRequired=admin

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: D:\Lightnings_Extractor Setup\Lightnings Extractor InnoSetup Script\isxdl\isxdl.dll; Flags: dontcopy
Source: "D:\C-Sharp\Extracting_Frames\Extracting_Frames\Extracting_Frames\bin\Release\Lightnings Extractor.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\C-Sharp\Extracting_Frames\Extracting_Frames\Extracting_Frames\bin\Release\DirectShowLib-2005.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\C-Sharp\Extracting_Frames\Extracting_Frames\Extracting_Frames\bin\Release\unfreez_wrapper.dll"; DestDir: "{app}"; Flags: ignoreversion
Source:  "D:\Appz\ffdshow_rev4225_20120105_clsid.exe"; DestDir: "{app}"; Flags: ignoreversion 
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Messages]
WinVersionTooLowError=MyApp requires Windows NT4, Windows 98 or later.

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: {app}\ffdshow_rev4225_20120105_clsid.exe; Parameters: /silent; StatusMsg: Installing ffdshow...

[Code]
var
  dotnetRedistPath: string;
  downloadNeeded: boolean;
  dotNetNeeded: boolean;
  memoDependenciesNeeded: string;

procedure isxdl_AddFile(URL, Filename: PChar);
external 'isxdl_AddFile@files:isxdl.dll stdcall';
function isxdl_DownloadFiles(hWnd: Integer): Integer;
external 'isxdl_DownloadFiles@files:isxdl.dll stdcall';
function isxdl_SetOption(Option, Value: PChar): Integer;
external 'isxdl_SetOption@files:isxdl.dll stdcall';


const
  dotnetRedistURL = 'http://www.microsoft.com/downloads/info.aspx?na=41&srcfamilyid=5765d7a8-7722-4888-a970-ac39b33fd8ab&srcdisplaylang=en&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f7%2fB%2f6%2f7B629E05-399A-4A92-B5BC-484C74B5124B%2fdotNetFx40_Client_setup.exe';
  // local system for testing...    
  // dotnetRedistURL = 'http://192.168.1.1/dotnetfx.exe';

function InitializeSetup(): Boolean;

begin
  Result := true;
  dotNetNeeded := false;

  // Check for required netfx on windows xp installation
  if (not RegKeyExists(HKLM, 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4.0')) then begin
    dotNetNeeded := true;
    if (not IsAdminLoggedOn()) then begin
      MsgBox('MyApp needs the Microsoft .NET Framework to be installed by an Administrator', mbInformation, MB_OK);
      Result := false;
    end else begin
      memoDependenciesNeeded := memoDependenciesNeeded + '      .NET Framework' #13;
      dotnetRedistPath := ExpandConstant('{src}\dotnetfx.exe');
      if not FileExists(dotnetRedistPath) then begin
        dotnetRedistPath := ExpandConstant('{tmp}\dotnetfx.exe');
        if not FileExists(dotnetRedistPath) then begin
          isxdl_AddFile(dotnetRedistURL, dotnetRedistPath);
          downloadNeeded := true;
        end;
      end;
      SetIniString('install', 'dotnetRedist', dotnetRedistPath, ExpandConstant('{tmp}\dep.ini'));
    end;
  end;

end;

function NextButtonClick(CurPage: Integer): Boolean;
var
  hWnd: Integer;
  ResultCode: Integer;

begin
  Result := true;

  if CurPage = wpReady then begin

    hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));

    // don't try to init isxdl if it's not needed because it will error on < ie 3
    if downloadNeeded then begin

      isxdl_SetOption('label', 'Downloading Microsoft .NET Framework');
      isxdl_SetOption('description', 'MyApp needs to install the Microsoft .NET Framework. Please wait while Setup is downloading extra files to your computer.');
      if isxdl_DownloadFiles(hWnd) = 0 then Result := false;
    end;
    if (Result = true) and (dotNetNeeded = true) then begin
      if Exec(ExpandConstant(dotnetRedistPath), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin
         // handle success if necessary; ResultCode contains the exit code
         if not (ResultCode = 0) then begin
           Result := false;
         end;
      end else begin
         // handle failure if necessary; ResultCode contains the error code
         Result := false;
      end;
    end;
  end;
end;

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
  s: string;

begin
  if memoDependenciesNeeded <> '' then s := s + 'Dependencies to install:' + NewLine + memoDependenciesNeeded + NewLine;
  s := s + MemoDirInfo + NewLine + NewLine;

  Result := s
end;

//testing

function InitializeSetups(): Boolean;

begin
  Result := true;
  dotNetNeeded := false;

  // Check for required netfx on windows xp installation
  if (not RegKeyExists(HKLM, 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4')) then begin
    dotNetNeeded := true;
    if (not IsAdminLoggedOn()) then begin
      MsgBox('MyApp needs the Microsoft .NET Framework to be installed by an Administrator', mbInformation, MB_OK);
      Result := false;
    end else begin
      memoDependenciesNeeded := memoDependenciesNeeded + '      .NET Framework' #13;
      dotnetRedistPath := ExpandConstant('{src}\dotnetfx.exe');
      if not FileExists(dotnetRedistPath) then begin
        dotnetRedistPath := ExpandConstant('{tmp}\dotnetfx.exe');
        if not FileExists(dotnetRedistPath) then begin
          isxdl_AddFile(dotnetRedistURL, dotnetRedistPath);
          downloadNeeded := true;
        end;
      end;
      SetIniString('install', 'dotnetRedist', dotnetRedistPath, ExpandConstant('{tmp}\dep.ini'));
    end;
  end;

end;

function NextButtonClicks(CurPage: Integer): Boolean;
var
  hWnd: Integer;
  ResultCode: Integer;

begin
  Result := true;

  if CurPage = wpReady then begin

    hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));

    // don't try to init isxdl if it's not needed because it will error on < ie 3
    if downloadNeeded then begin

      isxdl_SetOption('label', 'Downloading Microsoft .NET Framework');
      isxdl_SetOption('description', 'MyApp needs to install the Microsoft .NET Framework. Please wait while Setup is downloading extra files to your computer.');
      if isxdl_DownloadFiles(hWnd) = 0 then Result := false;
    end;
    if (Result = true) and (dotNetNeeded = true) then begin
      if Exec(ExpandConstant(dotnetRedistPath), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin
         // handle success if necessary; ResultCode contains the exit code
         if not (ResultCode = 0) then begin
           Result := false;
         end;
      end else begin
         // handle failure if necessary; ResultCode contains the error code
         Result := false;
      end;
    end;
  end;
end;

function UpdateReadyMemos(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
var
  s: string;

begin
  if memoDependenciesNeeded <> '' then s := s + 'Dependencies to install:' + NewLine + memoDependenciesNeeded + NewLine;
  s := s + MemoDirInfo + NewLine + NewLine;

  Result := s
end;

What you need to do is Run a Code script in Inno and look for .Net 4 in the registry:您需要做的是在 Inno 中运行代码脚本并在注册表中查找 .Net 4:

[Files]
;Redistributables
Source: Redistributables\*; DestDir: {tmp}; Flags: ignoreversion deleteafterinstall


[Code]
var dotNET40Missing: Boolean; // Is the .NET 4.0 Framework missing entirely?

function InitializeSetup(): Boolean;
begin
    // Test the presence of .NET 4.0
    if (not(RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4'))) then
        dotNET40Missing := True;

    Result := True;
end;

function ShouldInstalldotNET40(): Boolean;
begin
    Result := dotNET40Missing;
end;

[Run]
Filename: {tmp}\.NET 4.0.exe; Description: Install Microsoft .Net Framework 4.0;    Parameters: /q /noreboot; Flags: skipifdoesntexist; Check: ShouldInstalldotNET40

The [Files] copies .Net WebInstaller to the temp directory. [文件] 将 .Net WebInstaller 复制到临时目录。 [Run] Installs .Net 4 if [Code] return true [运行] 如果 [代码] 返回 true,则安装 .Net 4

EDIT编辑

I noticed you had我注意到你有

if (not RegKeyExists(HKLM, 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4.0')

instead of代替

if (not RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4.0')

There is an easy and robust way with the built-in function in Inno Setup: Inno Setup 中的内置功能有一种简单而强大的方法:

IsDotNetInstalled()

Check the documentation here:在此处查看文档:

https://jrsoftware.org/ishelp/index.php?topic=isxfunc_isdotnetinstalled https://jrsoftware.org/ishelp/index.php?topic=isxfunc_isdotnetinstalled

Sample usage for your case:您的案例的示例用法:

Result := IsDotNetInstalled(net4Client, 0);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM