| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 | ; -- CodeAutomation.iss --;; This script shows how to use IDispatch based COM Automation objects.[Setup]AppName=My ProgramAppVersion=1.5WizardStyle=modernDisableWelcomePage=noCreateAppDir=noDisableProgramGroupPage=yesDefaultGroupName=My ProgramUninstallDisplayIcon={app}\MyProg.exeOutputDir=userdocs:Inno Setup Examples Output[Code]{--- SQLDMO ---}const  SQLServerName = 'localhost';  SQLDMOGrowth_MB = 0;procedure SQLDMOButtonOnClick(Sender: TObject);var  SQLServer, Database, DBFile, LogFile: Variant;  IDColumn, NameColumn, Table: Variant;begin  if MsgBox('Setup will now connect to Microsoft SQL Server ''' + SQLServerName + ''' via a trusted connection and create a database. Do you want to continue?', mbInformation, mb_YesNo) = idNo then    Exit;  { Create the main SQLDMO COM Automation object }  try    SQLServer := CreateOleObject('SQLDMO.SQLServer');  except    RaiseException('Please install Microsoft SQL server connectivity tools first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');  end;  { Connect to the Microsoft SQL Server }  SQLServer.LoginSecure := True;  SQLServer.Connect(SQLServerName);    MsgBox('Connected to Microsoft SQL Server ''' + SQLServerName + '''.', mbInformation, mb_Ok);  { Setup a database }  Database := CreateOleObject('SQLDMO.Database');  Database.Name := 'Inno Setup';    DBFile := CreateOleObject('SQLDMO.DBFile');  DBFile.Name := 'ISData1';  DBFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\IS.mdf';  DBFile.PrimaryFile := True;  DBFile.FileGrowthType := SQLDMOGrowth_MB;  DBFile.FileGrowth := 1;  Database.FileGroups.Item('PRIMARY').DBFiles.Add(DBFile);  LogFile := CreateOleObject('SQLDMO.LogFile');  LogFile.Name := 'ISLog1';  LogFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\IS.ldf';  Database.TransactionLog.LogFiles.Add(LogFile);    { Add the database }  SQLServer.Databases.Add(Database);  MsgBox('Added database ''' + Database.Name + '''.', mbInformation, mb_Ok);  { Setup some columns }  IDColumn := CreateOleObject('SQLDMO.Column');  IDColumn.Name := 'id';  IDColumn.Datatype := 'int';  IDColumn.Identity := True;  IDColumn.IdentityIncrement := 1;  IDColumn.IdentitySeed := 1;  IDColumn.AllowNulls := False;  NameColumn := CreateOleObject('SQLDMO.Column');  NameColumn.Name := 'name';  NameColumn.Datatype := 'varchar';  NameColumn.Length := '64';  NameColumn.AllowNulls := False;    { Setup a table }  Table := CreateOleObject('SQLDMO.Table');  Table.Name := 'authors';  Table.FileGroup := 'PRIMARY';    { Add the columns and the table }    Table.Columns.Add(IDColumn);  Table.Columns.Add(NameColumn);  Database.Tables.Add(Table);  MsgBox('Added table ''' + Table.Name + '''.', mbInformation, mb_Ok);end;{--- IIS ---}const  IISServerName = 'localhost';  IISServerNumber = '1';  IISURL = 'http://127.0.0.1';procedure IISButtonOnClick(Sender: TObject);var  IIS, WebSite, WebServer, WebRoot, VDir: Variant;  ErrorCode: Integer;begin  if MsgBox('Setup will now connect to Microsoft IIS Server ''' + IISServerName + ''' and create a virtual directory. Do you want to continue?', mbInformation, mb_YesNo) = idNo then    Exit;  { Create the main IIS COM Automation object }  try    IIS := CreateOleObject('IISNamespace');  except    RaiseException('Please install Microsoft IIS first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');  end;  { Connect to the IIS server }  WebSite := IIS.GetObject('IIsWebService', IISServerName + '/w3svc');  WebServer := WebSite.GetObject('IIsWebServer', IISServerNumber);  WebRoot := WebServer.GetObject('IIsWebVirtualDir', 'Root');  { (Re)create a virtual dir }  try    WebRoot.Delete('IIsWebVirtualDir', 'innosetup');    WebRoot.SetInfo();  except  end;  VDir := WebRoot.Create('IIsWebVirtualDir', 'innosetup');  VDir.AccessRead := True;  VDir.AppFriendlyName := 'Inno Setup';  VDir.Path := 'C:\inetpub\innosetup';  VDir.AppCreate(True);  VDir.SetInfo();  MsgBox('Created virtual directory ''' + VDir.Path + '''.', mbInformation, mb_Ok);  { Write some html and display it }  if MsgBox('Setup will now write some HTML and display the virtual directory. Do you want to continue?', mbInformation, mb_YesNo) = idNo then    Exit;  ForceDirectories(VDir.Path);  SaveStringToFile(VDir.Path + '/index.htm', '<html><body>Inno Setup rocks!</body></html>', False);  if not ShellExecAsOriginalUser('open', IISURL + '/innosetup/index.htm', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode) then    MsgBox('Can''t display the created virtual directory: ''' + SysErrorMessage(ErrorCode) + '''.', mbError, mb_Ok);end;{--- MSXML ---}const  XMLURL = 'http://jrsoftware.github.io/issrc/ISHelp/isxfunc.xml';  XMLFileName = 'isxfunc.xml';  XMLFileName2 = 'isxfuncmodified.xml';procedure MSXMLButtonOnClick(Sender: TObject);var  XMLHTTP, XMLDoc, NewNode, RootNode: Variant;  Path: String;begin  if MsgBox('Setup will now use MSXML to download XML file ''' + XMLURL + ''' and save it to disk.'#13#13'Setup will then load, modify and save this XML file. Do you want to continue?', mbInformation, mb_YesNo) = idNo then    Exit;      { Create the main MSXML COM Automation object }  try    XMLHTTP := CreateOleObject('MSXML2.ServerXMLHTTP');  except    RaiseException('Please install MSXML first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');  end;    { Download the XML file }  XMLHTTP.Open('GET', XMLURL, False);  XMLHTTP.Send();  Path := ExpandConstant('{src}\');  XMLHTTP.responseXML.Save(Path + XMLFileName);  MsgBox('Downloaded the XML file and saved it as ''' + XMLFileName + '''.', mbInformation, mb_Ok);  { Load the XML File }  XMLDoc := CreateOleObject('MSXML2.DOMDocument');  XMLDoc.async := False;  XMLDoc.resolveExternals := False;  XMLDoc.load(Path + XMLFileName);  if XMLDoc.parseError.errorCode <> 0 then    RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason);    MsgBox('Loaded the XML file.', mbInformation, mb_Ok);  { Modify the XML document }    NewNode := XMLDoc.createElement('isxdemo');  RootNode := XMLDoc.documentElement;  RootNode.appendChild(NewNode);  RootNode.lastChild.text := 'Hello, World';  { Save the XML document }  XMLDoc.Save(Path + XMLFileName2);  MsgBox('Saved the modified XML as ''' + XMLFileName2 + '''.', mbInformation, mb_Ok);end;{--- Word ---}procedure WordButtonOnClick(Sender: TObject);var  Word: Variant;begin  if MsgBox('Setup will now check whether Microsoft Word is running. Do you want to continue?', mbInformation, mb_YesNo) = idNo then    Exit;  { Try to get an active Word COM Automation object }    try    Word := GetActiveOleObject('Word.Application');  except  end;    if VarIsEmpty(Word) then    MsgBox('Microsoft Word is not running.', mbInformation, mb_Ok)  else    MsgBox('Microsoft Word is running.', mbInformation, mb_Ok)end;{--- Windows Firewall ---}const   NET_FW_IP_VERSION_ANY = 2;   NET_FW_SCOPE_ALL = 0;procedure FirewallButtonOnClick(Sender: TObject);var  Firewall, Application: Variant;begin  if MsgBox('Setup will now add itself to Windows Firewall as an authorized application for the current profile (' + GetUserNameString + '). Do you want to continue?', mbInformation, mb_YesNo) = idNo then    Exit;  { Create the main Windows Firewall COM Automation object }  try    Firewall := CreateOleObject('HNetCfg.FwMgr');  except    RaiseException('Please install Windows Firewall first.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');  end;  { Add the authorization }  Application := CreateOleObject('HNetCfg.FwAuthorizedApplication');  Application.Name := 'Setup';  Application.IPVersion := NET_FW_IP_VERSION_ANY;  Application.ProcessImageFileName := ExpandConstant('{srcexe}');  Application.Scope := NET_FW_SCOPE_ALL;  Application.Enabled := True;  Firewall.LocalPolicy.CurrentProfile.AuthorizedApplications.Add(Application);  MsgBox('Setup is now an authorized application for the current profile', mbInformation, mb_Ok);end;{---}procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent);begin  with TButton.Create(WizardForm) do begin    Left := ALeft;    Top := ATop;    Width := WizardForm.CancelButton.Width;    Height := WizardForm.CancelButton.Height;    Caption := ACaption;    OnClick := ANotifyEvent;    Parent := WizardForm.WelcomePage;  end;end;procedure InitializeWizard();var  Left, LeftInc, Top, TopInc: Integer;begin  Left := WizardForm.WelcomeLabel2.Left;  LeftInc := WizardForm.CancelButton.Width + ScaleX(8);  TopInc := WizardForm.CancelButton.Height + ScaleY(8);  Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc;  CreateButton(Left, Top, '&SQLDMO...', @SQLDMOButtonOnClick);  CreateButton(Left + LeftInc, Top, '&Firewall...', @FirewallButtonOnClick);  Top := Top + TopInc;  CreateButton(Left, Top, '&IIS...', @IISButtonOnClick);  Top := Top + TopInc;  CreateButton(Left, Top, '&MSXML...', @MSXMLButtonOnClick);  Top := Top + TopInc;  CreateButton(Left, Top, '&Word...', @WordButtonOnClick);end;
 |