(转)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 - 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 - 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.
posted on 2009-11-23 20:18 NET未来之路 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/archive/2009/11/23/1608964.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值