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.