• 辛辛苦苦,写了个INNO的安装脚本


    ;参考了许多脚本例子,这个脚本包含了大部分可能用到设置。我的这个安装程序中用到了安装数据库、写INI、定制安装等

    ; 脚本用 Inno Setup 脚本向导生成。
    ; 查阅文档获取创建 INNO SETUP 脚本文件详细资料!

    [Setup]
    AppName=天翔纤维检验管理系统
    AppVerName=天翔纤维检验管理系统 V2008
    AppPublisher=青岛天翔软件有限公司
    AppPublisherURL=http://www.tinsoft.cn
    AppSupportURL=http://www.tinsoft.cn
    AppUpdatesURL=http://www.tinsoft.cn
    DefaultDirName={pf}\天翔纤维检验管理系统
    DefaultGroupName=天翔纤维检验管理系统
    LicenseFile=D:\安装程序\FiberTest\Lisence.txt
    OutputDir=D:\安装程序\FiberTest\Out
    OutputBaseFilename=Setup
    Compression=lzma
    SolidCompression=yes

    [Languages]
    Name: chi; MessagesFile: compiler:Default.isl

    [Tasks]
    Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
    Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

    [Types]
    Name: full; Description: 完全安装
    Name: Client; Description: 客户端安装
    Name: Server; Description: 服务器端安装
    Name: Custom; Description: 定制安装; Flags: iscustom

    [Components]
    Name: main; Description: 必须组件; Types: full Client Server Custom; Flags: fixed
    Name: Server; Description: 服务器组件; Types: full Server
    Name: Client; Description: 客户端组件; Types: full Client
    Name: Custom; Description: 定制组件; Types: Custom

    [Files]
    Source: 安装文件\FiberTest.exe; DestDir: {app}; Flags: ignoreversion; Components: Client
    Source: 安装文件\Data\*; DestDir: {app}\Data; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Server
    Source: 安装文件\Report\*; DestDir: {app}\Report; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Client; Tasks:
    Source: 安装文件\UPower.ini; DestDir: {app}; Components: Client
    Source: D:\安装程序\FiberTest\安装文件\background.bmp; DestDir: {app}; Flags: ignoreversion; Components: Client
    Source: D:\安装程序\FiberTest\安装文件\FiberTest.chm; DestDir: {app}; Flags: ignoreversion; Components: Client
    Source: 安装文件\FiberTest.ini; DestDir: {app}; Components: Client
    Source: D:\安装程序\FiberTest\安装文件\PY.dll; DestDir: {app}; Flags: ignoreversion; Components: Client
    Source: D:\安装程序\FiberTest\安装文件\PY.exe; DestDir: {app}; Flags: ignoreversion; Components: Client
    Source: D:\安装程序\FiberTest\安装文件\TinsZip.dll; DestDir: {app}; Flags: ignoreversion; Components: Client
    Source: 安装文件\UPower.exe; DestDir: {app}; Flags: ignoreversion; Components: Client

    ; 注意: 不要在任何共享系统文件中使用“Flags: ignoreversion”

    [Icons]
    Name: {group}\天翔纤维检验管理系统; Filename: {app}\FiberTest.exe
    Name: {group}\使用手册; Filename: {app}\FiberTest.chm; IconFilename: {app}\FiberTest.chm; Tasks: ; Languages:
    Name: {group}\{cm:UninstallProgram,天翔纤维检验管理系统}; Filename: {uninstallexe}
    Name: {userdesktop}\天翔纤维检验管理系统; Filename: {app}\FiberTest.exe; Tasks: desktopicon
    Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\天翔纤维检验管理系统; Filename: {app}\FiberTest.exe; Tasks: quicklaunchicon

    [Run]
    Filename: {app}\FiberTest.exe; Description: {cm:LaunchProgram,天翔纤维检验管理系统}; Flags: nowait postinstall skipifsilent unchecked; Components: ; Tasks: ; Languages:
    Filename: {app}\UPower.exe; Flags: nowait postinstall unchecked skipifsilent

    [INI]
    Filename: D:\安装程序\FiberTest\安装文件\UPower.ini; Section: UPower; Key: ConnectString; String: "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=FiberTest;Data Source={code:GetServer}"
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: ApplicationTitle; String: 天翔管理系统
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: ConnString; String: "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=FiberTest;Data Source={code:GetServer}"; Components: ; Tasks: ; Languages:
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: SocketServer; String: localhost
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: SocketPort; String: 211
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: ServerName; String: UPower.UserPower
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: BillNOLen; String: 10
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: BillPrintPreview; String: 1
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: BillPrint; String: 0
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: COMConnection; String: 1
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: DatabaseType; String: MSSQL
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: DepartmentID; String: Tins
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: Department; String: Tins
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: WebNav; String:
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 单位名称; String: TINS
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 输入法; String: 中文 (简体) - 微软拼音
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 任务单号自动生成; String: 1
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 打印预览; String: 1
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 条码打印机; String: Microsoft Office Document Image Writer
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 普通打印机; String: EPSON ME 1
    Filename: D:\安装程序\FiberTest\安装文件\FiberTest.ini; Section: FiberTest; Key: 打印机选择; String: 0
    [Code]
    {
    关于数据库操作
    }
    //http://hi.baidu.com/can2786/blog/item/e8c296cefeacdf0692457ef0.html
    //说明一下:这块程序的前半部分在INNO SETUP的实例里面就有,而后面如果对数据库进行备份和还原在实例里面没有,在网上也不好找,是本人费了好大劲一句一句试出来的,请大家转摘时注明,以表示对个人劳动的尊重。谢谢!

    {--- SQLDMO ---}    //关于SQLDMO的相关知识大家可以去网上搜
    const
    //SQL服务器名称,这个名称在安装SQL时会要求有个服务器名称的输入,所有每台机器上打开SQL服务器时看到的名称都不一样,如我如下图,但这里我们可以用一个通用的名称,就是(local),表示这个服务器是本地的。这样就可以了。
    //SQLServerName = '(LOCAL)';
    SQLDMOGrowth_MB = 0;


    var
      UserPage: TInputQueryWizardPage;
      UsagePage: TInputOptionWizardPage;
      LightMsgPage: TOutputMsgWizardPage;
      KeyPage: TInputQueryWizardPage;
      ProgressPage: TOutputProgressWizardPage;
      DataDirPage: TInputDirWizardPage;
      SQLServerName:String;

     

    //数据库的创建与还原事件写完了,但是它不会智能的知道什么时候去执行,所以我们要告诉它什么时候执行。下面是在程序安装完,在结束页面上建立了一个BUTTON按钮,当按下这个按钮时,会执行数据库的事件响应。
    {---}
    //创建一个button
    procedure CreateButton(ALeft, ATop: Integer; ACaption: String; ANotifyEvent: TNotifyEvent);
    begin
    with TButton.Create(WizardForm) do //button对象的创建
    begin
      Left := ALeft;    //button的位置与宽高
      Top := ATop;
      Width := WizardForm.CancelButton.Width;
      Height := WizardForm.CancelButton.Height;
      Caption := ACaption;                            //button的名称
      OnClick := ANotifyEvent;
      //这个是给创建的button指定一个父窗口,也就是说让它在哪个页面上边显示出来
      Parent := WizardForm.FinishedPage; //这里指定的是窗体的结束页
    end;
    end;

    //这是创建一个按钮按下的事件,这个按钮就是在安装向导中页面中建立的一个“配置数据库”的按钮
    procedure SQLDMOButtonOnClick(Sender: TObject);
    var
    //用到的一些变量
    SQLServer, Database, DBFile, LogFile: Variant;
    IDColumn, NameColumn, Table,oBackup,oRestore: Variant;
    db_path:string;
    //这个变量用来保存读取注册表的键值
    ResultStr: String;
    begin
    { Create the main SQLDMO COM Automation object }

    //检查是否已安装SQL
    try
      SQLServer := CreateOleObject('SQLDMO.SQLServer');
    except
      RaiseException('您还没有安装SQL数据库.'#13#13'(Error ''' + GetExceptionMessage + ''' occurred)');
    end;

    { Connect to the Microsoft SQL Server }

    //连接SQL
    SQLServer.LoginSecure := True;
    SQLServer.Connect(SQLServerName);
    //SQLServer.Connect(SQLServerName,'sa','');


    //MsgBox('连接到SQL服务器 ''' + SQLServerName + '''.', mbInformation, mb_Ok);

    { Setup a database }
    try
      MsgBox(ExpandConstant('{app}')+'\data\FiberTest_Data.MDF;'+ExpandConstant('{app}')+'\data\FiberTest_Log.LDF', mbInformation, mb_Ok);
      //SQLServer.AttachDB('FiberTest',ExpandConstant('{app}')+'\data\FiberTest_Data.MDF;'+ExpandConstant('{app}')+'\data\FiberTest_Log.LDF');
      SQLServer.AttachDBWithSingleFile('FiberTest',ExpandConstant('{app}')+'\data\FiberTest_Data.MDF');
      MsgBox('数据库安装成功!', mbInformation, mb_Ok);
    except
      MsgBox('数据库安装失败!', mbInformation, mb_Ok);
    end;
    {
    //创建SQL数据库文件
    Database := CreateOleObject('SQLDMO.Database');
    Database.Name := 'FiberTest';    //要创建的数据库名称

    DBFile := CreateOleObject('SQLDMO.DBFile');
    DBFile.Name := 'FiberTestData1';
    //数据库记录
    DBFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\FiberTest_Data.MDF';
    DBFile.PrimaryFile := True;
    DBFile.FileGrowthType := SQLDMOGrowth_MB;
    DBFile.FileGrowth := 1;

    Database.FileGroups.Item('PRIMARY').DBFiles.Add(DBFile);

    LogFile := CreateOleObject('SQLDMO.LogFile');
    LogFile.Name := 'FiberTestLog1';
    //数据库日记
    LogFile.PhysicalName := 'c:\program files\microsoft sql server\mssql\data\FiberTest_Log.LDF';

    Database.TransactionLog.LogFiles.Add(LogFile);

    // Add the database

    //添加数据库
    SQLServer.Databases.Add(Database);
    }
    //MsgBox('Added database ''' + Database.Name + '''.', mbInformation, mb_Ok);

    {
    //数据备份
        oBackup := CreateOleObject('SQLDMO.Backup');     //创建一个备份对象
        oBackup.Database := 'louyu';       //要备份的数据库名称
        oBackup.Files := 'f:\louyu3.bak';   //备份到什么地方
        oBackup.BackupSetName := 'louyu3.bak';     //备份的名称
        oBackup.BackupSetDescription := 'bakDescription';
        oBackup.Initialize := true;
        oBackup.SQLBackup(sqlServer);    //执行SQL备份操作

    //数据还原

    //重点说明:

    //数据库的备份文件在打好的包中的某个位置,要还原数据库首先要找到备份的文件,找备份的文件的话在这之前还要知道软件安装到了什么地方,也就是安装路径。在程序安装时我们在注册表中建立了相关信息,其中有软件安装路径的记录,关于注册表请查阅前面写的“INNO SETUP注册表的添加与读取”。
    //为什么还原数据库时用这种方法呢,好像是绕了个圈子一样,其实我也认为这可能不是一种好方法,但是在这我不知道还有什么别的方法来获得安装包中的数据(文件)或软件要安装的路径。app、pf等在这都无法直接使用,所以才用了这种笨方法。
    //如果哪位朋友有好方法,请告知我。


    //从注册表中获得程序安装的路径,根据路径找到还原数据库的备份文件。
    if RegQueryStringValue(HKLM, 'SOFTWARE\*******', 'Server', ResultStr) then
    begin
      ResultStr := RemoveQuotes(ResultStr);
      msgbox(resultstr,mbinformation,mb_ok);
      try
        oRestore := CreateOleObject('SQLDMO.Restore');      //创建还原对象
        oRestore.Database := 'dbase';          //还原的数据库名称
        db_path:=resultstr + '\数据库文件\dbase.bak';          //备份文件的路径
        MsgBox(db_path,mbinformation,mb_ok);            //测试一下看路径对不对
        oRestore.files :=db_path;              //指定备份文件
        oRestore.replacedatabase := true;
        oRestore.sqlrestore(sqlserver);      //执行还原操作
        MsgBox('数据库还原成功!',mbinformation,mb_ok);
      except
        MsgBox('数据库还原失败!,请重试或查阅帮助文档进行手动配置!',mbinformation,mb_ok);
      end;
    end;
    }
    end;


    procedure InitializeWizard;
    var
    Left, Top, TopInc: Integer;
    begin

    //Left := WizardForm.WelcomeLabel2.Left;
    //TopInc := WizardForm.CancelButton.Height + 8;
    //Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc;

    //CreateButton(Left, Top, '安装数据库(&S)', @SQLDMOButtonOnClick);

      { 创建页面 }

      UserPage := CreateInputQueryPage(wpWelcome,
        '服务器信息', '请填写服务器的名称,该服务器为安装了SQL Server的计算机。',
        '请指定你的名字和公司,然后单击“下一步”。');
      UserPage.Add('服务器名称:', False);


      UsagePage := CreateInputOptionPage(UserPage.ID,'安装选择', '进行客户端还是服务器端安装?','请指定你想安装的方式,然后单击“下一步”。',
        True, False);
      UsagePage.Add('安装数据库');
      UsagePage.Add('不安装数据');

      {设置默认值,如果可能,使用这些设置最后一次贮存}

      UserPage.Values[0] := GetPreviousData('Name', ExpandConstant('{computername}'));

      case GetPreviousData('UsageMode', '') of
        'Server': UsagePage.SelectedValueIndex := 0;
        'Client': UsagePage.SelectedValueIndex := 1;
      else
        UsagePage.SelectedValueIndex := 1;
      end;
    end;

    procedure RegisterPreviousData(PreviousDataKey: Integer);
    var
      UsageMode: String;
    begin
      { 贮存你可以下次进行恢复的设置 }
      SetPreviousData(PreviousDataKey, 'Name', UserPage.Values[0]);
      case UsagePage.SelectedValueIndex of
        0: UsageMode := 'Server';
        1: UsageMode := 'Client';
      end;
    end;

    function ShouldSkipPage(PageID: Integer): Boolean;
    begin
      { 跳过不显示的页面 }
    end;

    function NextButtonClick(CurPageID: Integer): Boolean;
    var
      I: Integer;
    begin
      { 在用户继续前进行验证 }
      if CurPageID = UserPage.ID then
      begin
        if UserPage.Values[0] = '' then
        begin
          MsgBox('你必须输入服务器的名字。', mbError, MB_OK);
          Result := False;
        end
        else
        begin
      SQLServerName:=UserPage.Values[0];
      Result := True;
    end;
      end
      else
    Result :=True;
    end;

    function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
      MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
    var
      S: String;
      Left, Top, TopInc: Integer;
    begin
      { 填写带普通设置和自定义设置的“准备演示” }
      S := '';
      S := S + '服务器名称:' + NewLine;
      S := S + Space + UserPage.Values[0] + NewLine;

      S := S + NewLine;

      S := S + '使用模式:' + NewLine + Space;
      case UsagePage.SelectedValueIndex of
        0: S := S + '服务器端';
        1: S := S + '客户端';
      end;
      S := S + NewLine + NewLine;

      S := S + MemoDirInfo + NewLine;
      Result := S;

      Left := WizardForm.WelcomeLabel2.Left;
      TopInc := WizardForm.CancelButton.Height + 8;
      Top := WizardForm.WelcomeLabel2.Top + WizardForm.WelcomeLabel2.Height - 4*TopInc;

      if UsagePage.SelectedValueIndex = 0 then
    CreateButton(Left, Top, '安装数据库(&S)', @SQLDMOButtonOnClick);
    end;

    function GetServer(Param: String): String;
    begin
      Result := UserPage.Values[0];
    end;

    function GetUser(Param: String): String;
    begin
      { Return a user value }
      { Could also be split into separate GetUserName and GetUserCompany functions }
      if Param = 'Name' then
        Result := UserPage.Values[0];
    end;


     

  • 相关阅读:
    MongoDB学习笔记(一) MongoDB介绍及安装
    8种Nosql数据库系统对比
    15个nosql数据库
    Chapter 11.预写式日志(Write-Ahead Logging (WAL)
    IE浏览器跟火狐浏览器兼容写法3
    IE浏览器跟火狐浏览器兼容写法2
    IE浏览器跟火狐浏览器兼容写法1
    VMware Workstation 10.0 安装与配置
    zend studio安装与配置
    javascript基础
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/1411032.html
Copyright © 2020-2023  润新知