Suche // Search:

12.07.2010

Eigenen Installer für Formulare und Folder Level Skripte erstellen
//
Create own installer for forms and folder level scripts


Sicherheit ist wichtig, bringt aber auch Probleme mit sich. Wenn Sie mit Formularen und Skripten arbeiten, merken Sie schnell, dass sie bei Acrobat oder Reader die interessantesten Funktionen meist nur aus vertrauenswürdigen Umgebungen heraus ausführen dürfen.
Dafür müssen Sie die Skripte zum Teil in sogenannte Folder Level Scripts auslagern, die dann auf dem jeweiligen PC erst mal installiert werden müssen.
Das klappt in eigenem Büro meist noch ohne großen Aufwand.
Aber was, wenn sie ihre Dateien an Kunden verteilen, die von sowas keine Ahnung haben oder denen das zu aufwendig ist.

Ganz klar, bauen sie einen Setup, der das alles erledigt.
Dafür empfiehlt sich zum Beispiel die Freeware Inno Setup.
Durch diverse Zusatzprogramme ist es ein mächtiges Tool, mit dem sie sehr umfangreiche Installer mit professionellen Touch erstellen können.

Diese Methode bietet einigen Vorteile.
So können Sie beliebig viele Dateien unterschiedlichsten Typs mit nur einer Setup-Datei verteilen, die Benutzer brauchen lediglich den Setup einmal ausführen, um alles an seinem Platz zu haben und über die Deinstallationsroutine können sie auch alles auf einmal wieder entfernen.

Dieses Beispiel zeigt ihnen einen Installer, der prüft, ob ein Adobe Reader oder Acrobat installiert ist, dann den Pfad zu deren JavaScript-Ordner erstellt und ein Folder Level Script sowie einige XFA-Formulare installiert.
Der Installer ist zudem zweisprachig ausgelegt (deutsch und englisch) und mit eigenem Layout versehen.
Und das alles braucht weniger als 150 Zeilen Code.


Security is neccessary but causes other problems. Ic you work with forms and scripts you will learn that Acrobat or Reader allow the usage of interessting functions such as "saveAs" only from trusted enviromments.
Therefore you have to writhe part of your scripts into so called folder level scripts which have to be installed on each induvidual computer first.
In a office this maybe not the problem.
But what if your distribute your forms to customers who don't know how to install those files or don't want?

You will have to build a setup that will do this automatically.
Therefore the freeware Inno Setup is advisable.
With a lot of extensions available it's a powerful tool to create comprehensive installers with a professional touch.

This method offers several advantages.
You can distribute any number of files with different file types at once with only one setup-file.
Also, the users only need to execute the setup once to have everything in the right place and with the uninstall routine they also can remove all at once.

This example shows an installer that checks if there is an Adobe Reader or Acrobat installed.
If so it generates the path to the JavaScrips folder and installs a Folder Level Script and some XFA forms.
Also, the installer is multiligual (german and english) and has its own layout.
All done with less that 150 lines of code.

LCB Sample Installer:

1: Sprache auswählen // Select language










2: Installer prüft ob Acrobat/Reader installiert ist // Installer checks if Acrobat/Reader is installed







3: Installationsassistent startet // Install wizard runs















4: Aufgaben des Setups auswählen // Select task for the setup















5: Installation wird durchgeführt // Installation proceeds















6: Setup abschließen // Complete setup















7: Installierte Dateien im Programme-Menü // Installed files in the program menu


















8: Installiertes Folder Level Script // Installed folder level script















Inno Setup Code:
; LCB Installer Script
  #define MyAppName "LCB"
  #define MyAppVerName "1.0"


[Setup]
  AppId={{536B756A-54AA-4C37-8ADA-0C942B8327E7}
  AppName={#MyAppName}
  AppVerName={#MyAppName} {#MyAppVerName}
  VersionInfoVersion={#MyAppVerName}
  AppPublisher=Your Name Here
  AppComments=
  AppPublisherURL=
  AppSupportURL=
  AppUpdatesURL=
  AppCopyright=
  DefaultDirName={pf}\{#MyAppName}
  DisableDirPage=yes
  DefaultGroupName={#MyAppName}
  DisableProgramGroupPage=yes
  InfoAfterFile=SourceFiles\LCB_ReadMe.rtf
  OutputDir=FinalFiles
  OutputBaseFilename={#MyAppName}_Sample_Installer_{#MyAppVerName}
  Compression=lzma
  SolidCompression=yes
  SetupIconFile=SourceFiles\LCB_Icon.ico
  UninstallDisplayIcon=SourceFiles\LCB_Uninstall_Icon.ico
  UninstallDisplayName={#MyAppName} {#MyAppVerName}
  WizardImageFile=SourceFiles\LCB_Wizard_164x314.bmp
  WizardSmallImageFile=SourceFiles\LCB_Wizard_55x55.bmp


[Languages]
  Name: en; MessagesFile: compiler:Default.isl
  Name: de; MessagesFile: compiler:Languages\German.isl


[Files]
  Source: SourceFiles\ISSkin.dll; DestDir: {app}; Flags: dontcopy
  Source: SourceFiles\Styles\Office2007.cjstyles; DestDir: {tmp}; Flags: dontcopy
  Source: SourceFiles\LCB_SaveAs.js; DestDir: {code:ReturnPath}; Flags: ignoreversion
  Source: SourceFiles\LCB\*; DestDir: {app}\LCB\; Flags: ignoreversion recursesubdirs createallsubdirs
  Source: SourceFiles\LCB_ReadMe.rtf; DestDir: {app}; Flags: ignoreversion
  Source: SourceFiles\LCB_Licence.rtf; DestDir: {app}; Flags: ignoreversion
  Source: SourceFiles\LCB_Icon.ico; DestDir: {app}; Flags: ignoreversion
  Source: SourceFiles\LCB_Uninstall_Icon.ico; DestDir: {app}; Flags: ignoreversion


[Icons]
  Name: {group}\LCB SaveAs Sample; Filename: {app}\LCB\LCB_SaveAs.pdf; WorkingDir: {app}; IconFilename: {app}\LCB_Icon.ico
  Name: {group}\LCB Control View Sample; Filename: {app}\LCB\LCB_Control_View.pdf; WorkingDir: {app}; IconFilename: {app}\LCB_Icon.ico
  Name: {group}\LCB Stacked Bar Chart Sample; Filename: {app}\LCB\LCB_FormCalc_Charts_StackedBarChart.pdf; WorkingDir: {app}; IconFilename: {app}\LCB_Icon.ico
  Name: {group}\Uninstall LCB; Filename: {uninstallexe}; IconFilename: {app}\LCB_Icon.ico
  Name: {userdesktop}\LCB; Filename: {app}\LCB\LCB_SaveAs.pdf; WorkingDir: {app}; Tasks: desktopicon1; IconFilename: {app}\LCB_Icon.ico; Comment: Open LCB_SaveAs Sample
  Name: {userdesktop}\LCB; Filename: {app}\LCB\LCB_Control_View.pdf; WorkingDir: {app}; Tasks: desktopicon2; IconFilename: {app}\LCB_Icon.ico; Comment: Open Control View Sample
  Name: {userdesktop}\LCB; Filename: {app}\LCB\LCB_FormCalc_Charts_StackedBarChart.pdf; WorkingDir: {app}; Tasks: desktopicon3; IconFilename: {app}\LCB_Icon.ico; Comment: Open Stacked Bar Chart Sample


[Tasks]
  Name: desktopicon1; Description: Create shortcut on Desktop for SaveAs Sample; Flags: unchecked
  Name: desktopicon2; Description: Create shortcut on Desktop for Control View Sample; Flags: unchecked
  Name: desktopicon3; Description: Create shortcut on Desktop for Stacked Bar Chart Sample; Flags: unchecked


[Run]
  Filename: {app}\LCB\LCB_SaveAs.pdf; Verb: open; Description: Open LCB SaveAs Sample; Flags: postinstall shellexec unchecked
  Filename: {app}\LCB\LCB_Control_View.pdf; Verb: open; Description: Open LCB Control View Sample; Flags: postinstall shellexec unchecked
  Filename: {app}\LCB\LCB_FormCalc_Charts_StackedBarChart.pdf; Verb: open; Description: Open LCB Stacked Bar Chart Sample; Flags: postinstall shellexec unchecked


[CustomMessages]
  de.msgbox_1 =Setup hat einen geeigneten PDF-Viewer (Adobe Reader/Acrobat) auf Ihren Computer gefunden und kann nun fortgesetzt werden.%n
  de.msgbox_2 =%nGefundener PDF-Viewer: %n
  en.msgbox_1 =Setup found PDF-Viewer (Adobe Reader/Acrobat) on your computer and can be continued now.%n
  en.msgbox_2 =%nFound PDF-Viewer: %n
  de.msgbox_Error_1 =Fehler aufgetreten:%nEs wurde kein Adobe Reader bzw. Adobe Acrobat auf Ihrem Computer gefunden.%n%n
  de.msgbox_Error_2 =Sie müssen mindestens einen Adobe Reader 8.1 oder Adobe Acrobat 8 installiert haben,%num diesen Installer benutzen zu können.%n%n
  de.msgbox_Error_3 =Setup wird nun beendet.
  en.msgbox_Error_1 =An error occured:%nNo Adobe Reader or Adobe Acrobat could be found on your computer.%n%n
  en.msgbox_Error_2 =Install at least Adobe Reader 8.1 or Adobe Acrobat 8 first,%nbefore you use this Installer.%n%n
  en.msgbox_Error_3 =Setup will be aborted now.


[Code]
  procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
  external 'LoadSkin@files:isskin.dll stdcall';
  procedure UnloadSkin();
  external 'UnloadSkin@files:isskin.dll stdcall';
  function ShowWindow(hWnd: Integer; uType: Integer): Integer;
  external 'ShowWindow@user32.dll stdcall';
  function InitializeSetup(): Boolean;
  begin
   ExtractTemporaryFile('Office2007.cjstyles');
   LoadSkin(ExpandConstant('{tmp}\Office2007.cjstyles'), 'NormalSilver.ini');
   Result := True;
  end;


  procedure DeinitializeSetup();
  begin
   ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
   UnloadSkin();
  end;


  function CheckAdobeViewer(): String;
    var
    AdobeReaderVersion,AdobeAcrobatVersion,Version :  String;
    begin
    Result:='no';


  if  (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe', '', AdobeReaderVersion))
    then
      begin
        GetVersionNumbersString( AdobeReaderVersion , Version);
        Result := 'Adobe Reader Version: ' + Version;
      end
  else
    if (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe', '', AdobeAcrobatVersion))
      then
        begin
          GetVersionNumbersString( AdobeAcrobatVersion ,Version);
          Result := 'Adobe Acrobat Version: ' + Version;
        end
  else
    begin
      MsgBox(ExpandConstant('{cm:msgbox_Error_1}') + ExpandConstant('{cm:msgbox_Error_2}') + ExpandConstant('{cm:msgbox_Error_3}'),MBError,mb_ok);
        begin
          Abort;
        end
    end
  end;


  function CheckAdobePath(): String;
    var
    FilePath: String;
    begin
      FilePath := '';
      if (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe','', FilePath))
        then
          begin
            result := ExtractFileDir(FilePath) + '\JavaScripts\';
          end


  if (RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Acrobat.exe','', FilePath))
    then
      begin
        result := ExtractFileDir(FilePath) + '\JavaScripts\';
      end
  end;


  function  ReturnPath (Get:String):String;
    begin
      result := CheckAdobePath;
    end;


  procedure InitializeWizard();
  begin MsgBox(ExpandConstant('{cm:msgbox_1}') + ExpandConstant('{cm:msgbox_2}') + CheckAdobeViewer,MBinformation,mb_ok);
  end;



Dieses Script und auch einen fertigen Setup können Sie hier herunterladen.
Die Dateiendung des Setups müssen sie nach dem Download in *.EXE ändern!
Läuft unter Windows XP / Vista / 7 - 32Bit & 64Bit.

You can download this script and a working setup here.
After downloading the setup you need to change the file extension to *.EXE!
Runs under Windows XP / Vista / 7 - 32Bit & 64Bit.


Bespiel Inno Setup *.iss-Datei // Example Inno Setup *.iss file:

Beispiel Setup.exe // Example Setup.exe




Inno Setup und viele Erweierungen bekommen Sie unter folgenden URLs:


You can get Inno Setup and a lot of extenstion under the following URLs:


Inno Setup Download:
http://www.jrsoftware.org/isinfo.php

Inno Setup Erweiterungen // Inno Setup Extensions (3rd Party):
http://www.jrsoftware.org/is3rdparty.php