(转)Inno Setup Script Silently install .NET 3.5 and Sql Server Express

Disclaimer: Some of this s-c-r-i-p-t is adapted from an example I found on another website, I have been unable to retrace the original, if you recognise some of this work as your own please contact me and I would be happy to credit you.

There are a few key parts to creating a silent install controlled by Inno to install .Net Framework and SQL server.

1).

First you need to create a .ini file containing the parameters to be passed to the SQL Server installer. For most basic or simple installations you will need only a few of lines inside this file.

[Options]
ADDLOCAL=SQL_Engine
INSTANCENAME=YOURINSTANCENAME

(setup.ini)

The firstline [Options] needs to be there it doesn’t really do anything.

ADDLOCAL = SQL_Engine - this tells the installed to install a new database engine, you could replace this with ADDLOCAL = All - this would install all possible features of the SQL Server Express. However this is in most cases unlikely to be neccesary.

INSTANCENAME = YOURINSTANCENAME - replace ‘YOURINSTANCENAME’ with any name you like, this is to distinguish your database engine from those installed by other programs.

2).

The Script notice all the usual InnoSetup s-c-r-i-p-t and then a section at the end [code] anything after this is in the PASCAL programming language. If you have never used pascal it is almost a cross between C and BASIC / VB.

If you are used to programming in C when you see “then begin” read it as ‘{’ and when you see “end” read it as ‘}’, you will then find it makes a lot more sense, all that is left is a few syntatical differences.

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

#define MyAppName “AppName”
#define MyAppVerName “AppName version”
#define MyAppPublisher “Company Name”
#define MyAppURL “CompanyWebsite”
#define MyAppExeName “Appname.exe“

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=C:\SetupBuild\Output
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Des-c-r-i-p-tion: {cm:CreateDesktopIcon}; GroupDes-c-r-i-p-tion: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: C:\Program Files\ISTool\isxdl.dll; Flags: dontcopy ;(this DLL is required to compile)
Source: C:\filenames.exe; DestDir: {app}; Flags: ignoreversion

;Add the rest of you programs files above.

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

[Run]
Filename: {app}\{#MyAppExeName}; Des-c-r-i-p-tion: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent

[Code]
var
  dotnetRedistPath: string;
  sqlserverPath: string;
  sqlNeeded: boolean;
  sqlInstance: boolean;
  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://download.microsoft.com/download/6/0/f/60fc5854-3cb8-4892-b6db-bd4f42510f28/dotnetfx35.exe’;

//this url was correct at time of publication for .net 3.5 you may need to change this in future.
  // local system for testing…
  // dotnetRedistURL = ‘http://192.168.1.1/dotnetfx35.exe’;

function InitializeSetup(): Boolean;

begin
  Result := true;
  dotNetNeeded := false;
  sqlNeeded := false;
  sqlInstance:= false;

  // Check for required netfx installation
  if (not RegKeyExists(HKLM, ‘Software\Microsoft\.NETFramework\AssemblyFolders\v3.5′)) then begin
    dotNetNeeded := true;
    if (not IsAdminLoggedOn()) then begin
      MsgBox(’GasSoft 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}\dotnetfx35.exe’);
      if not FileExists(dotnetRedistPath) then begin
        dotnetRedistPath := ExpandConstant(’{tmp}\dotnetfx35.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;

  if( not RegKeyExists(HKLM, ‘SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools’)) then begin
 sqlNeeded := true;
 if(not IsAdminLoggedOn()) then begin
 MsgBox(’GasSoft needs Microsoft SQL Server to be installed by an administrator’, mbInformation, MB_OK);
 Result := false;
 end else begin
  memoDependenciesNeeded := memoDependenciesNeeded + ‘      SQL Server Express 2005′ #13;
  sqlserverPath := ExpandConstant(’{src}\SQLEXPR32.EXE’);
  end;
 end else begin
 if( not RegKeyExists(HKLM, ‘SOFTWARE\Microsoft\Microsoft SQL Server\YOURINSTACENAME‘)) then begin
 sqlNeeded := false;
 sqlInstance := true;
 if(not IsAdminLoggedOn()) then begin
 MsgBox(’YOURAPPNAME needs Microsoft SQL Server to be installed by an administrator’, mbInformation, MB_OK);
 Result := false;
 end else begin
  memoDependenciesNeeded := memoDependenciesNeeded + ‘     Add instance to SQL Server’ #13;
  sqlserverPath := ExpandConstant(’{src}\SQLEXPR32.EXE’);
  end;
 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(’des-c-r-i-p-tion’, ‘YOURAPPNAME 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), ‘/qb’, ”, 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;

     if (Result = true) and (sqlNeeded = true) and (not sqlInstance = true) then begin
    if Exec(ExpandConstant(sqlserverPath), ‘/settings ‘+ExpandConstant(’{src}’)+’\setup.ini /qb’, ”, 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;

     if (Result = true) and (sqlNeeded = false) and (sqlInstance = true) then begin
      if Exec(ExpandConstant(sqlserverPath), ‘/settings ‘+ExpandConstant(’{src}’)+’\setup.ini /qb’, ”, 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;

You will find that some of the s-c-r-i-p-t (provided by unknown) cleverly checks to see if the .net files are included in the same directory “{src}” as the setup program, if not it runs a downloader program and downloads the required files. I have not adjusted the s-c-r-i-p-t to do this for SQL server as I did not deem this necessary, but if you struggle to make the changes yourself then feel free to contact me and I will try my best.

 Now the s-c-r-i-p-t should compile and faultlessly install firstly the .net framework , and/or sql server express.

Highlighted in red are small sections you would need to change to customise this for your own use.

时间: 2024-09-19 16:03:38

(转)Inno Setup Script Silently install .NET 3.5 and Sql Server Express的相关文章

inno setup介绍(转)

使 用 笔 记 1.Inno Setup 是什么?Inno Setup 是一个免费的 Windows 安装程序制作软件.第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞争力可能已经超过一些商业的安装程序制作软件.关键功能: 支持现在所有正在使用的 32 位 Windows 版本: Windows 95,98,2000,Server 2003,XP,Me,NT 4.0 (不需要服务包). 支持创建单个 EXE 格式的安装程序,使你的程序可以很方便地在网络上发表.同时

以前编写的inno setup脚本,涵盖了自定义安装界面,调用dll等等应用 (转)

; Script generated by the Inno Setup 脚本向导.   ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!      ; 为1的时候表示定义成试用版本   #define VERSION_TYPE ReadIni('Setup.ini', 'SetupType', 'type', '0')      #if VERSION_TYPE == "2"       

Check .NET Version with Inno Setup

原文  http://www.kynosarges.de/DotNetVersion.html Inno Setup by Jordan Russell is a great installation scripting program, but lacks a built-in function to determine the .NET Framework version installed on the target machine. Fortunately, it's easy to w

注册flash.ocx inno setup (转)

; 脚本由 Inno Setup 脚本向导 生成!   ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!         #define MyAppName "xx模块"   #define MyAppName2 "xx模块"   #define MyAppName3 "xx系统"   #define MyAppVersion "2012"   #define IncludeFramework true 

Inno setup定制安装界面

原文:Inno setup定制安装界面 Innosetup功能很强大,可以通过它提供的Wizard接口来定制界面,但我对PASCAL语言不熟悉,也不清楚通过那种接口可改动的范围有多大,最后做出来的效果是否好,所以选择了通过一个DLL来实现我的界面.   首先,脚本中增加如下设置,以禁至所有Inno setup自身显示的界面: DisableDirPage=yes DisableFinishedPage=yes DisableProgramGroupPage=yes DisableReadyMem

用inno Setup制作web项目安装包

原文:用inno Setup制作web项目安装包 用inno Setup制作安装包 新建一个文件夹exambody,放apache-tomcat-6.0.33.mysql-5.1.37-win32.java(注:jdk)和图标exambody.ico   1.       批处理安装mysql服务: 在mysql-5.1.37-win32\bin 的目录下: 新建一个文件:启动服务.bat 里面写: cd /d %~dp0                                     

Inno Setup connection to the database and create

原文 Inno Setup connection to the database and create Description: the first half of this program in Inno Setup instance inside there, behind the database backup and restore inside the instance is not easy to find online, I spent a great difficulty sen

用Inno Setup制作WEB程序安装包

原文 用Inno Setup制作WEB程序安装包 最近做了一个WEB程序的安装包,我把制作的过程做个介绍,贴出源码给大家做个参考 看看inno 的脚本     [Setup] AppCopyright=test AppName=test AppVerName=test v2.0 SolidCompression=true OutputDir=Output\ OutputBaseFilename=test_setup DefaultDirName={pf}\Lms DefaultGroupName

使用Inno Setup 打包jdk、mysql、tomcat、webapp等为一个exe安装包(转)

之前一直都没涉及到打包安装方面的东西,都是另一个同事负责的,使用的工具(installshield)也比较高大上一点,可是后来他离职以后接受的同事也只能是在这个基础上做个简单的配置,然后打包,可是现在做的项目和原来的完全不一样以后就不能使用之前的了,只能是自己硬着头皮来弄个比较简单快捷的了. 切入正题,如标题所述使用inno setup来打包一个java web 相关的内容为一个exe,.net web类似,这个工具可以在网上直接找到下载,有汉化版的,并且里面也有帮助手册可以参考.把里面的一些敏