HoopChina Blog ->IT ->Inno Setup Script Silently install .NET 3.5 and Sql Server Express
登陆 -> 注册 -> 博客管理 -> 搜索-> 回复主题

元月初二
2008-08-21 09:29

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

Disclaimer: Some of this script 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 script 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; Description: {cm:CreateDesktopIcon}; GroupDescription: {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}; Description: {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(’description’, ‘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 script (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 script 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 script 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.


共:1条记录
查看完整版本: [-- Inno Setup Script Silently install .NET 3.5 and Sql Server Express --] [-- top --]


HoopChina Blog - powered by phpwind.net
HoopChina Blog ->IT ->Inno Setup Script Silently install .NET 3.5 and Sql Server Express
登陆 -> 注册 -> 博客管理 -> 搜索-> 回复主题

元月初二
2008-08-21 09:29

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

Disclaimer: Some of this script 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 script 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; Description: {cm:CreateDesktopIcon}; GroupDescription: {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}; Description: {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(’description’, ‘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 script (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 script 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 script 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.


共:1条记录
查看完整版本: [-- Inno Setup Script Silently install .NET 3.5 and Sql Server Express --] [-- top --]