InnoSetup安装包制作事例

;AUTHOR: zhangsongtao@xx.com.cn
;DATE  :     2007-06-04  - 2007-06-13
[Setup]
AppName=xx系统
AppVerName=xx系统 V2.0
AppPublisher=xx有限公司
AppPublisherURL=http://www.xx.com.cn
AppSupportURL=http://www.xx.com.cn
AppUpdatesURL=http://www.xx.com.cn
DefaultDirName= {code:GetInitPath}
DefaultGroupName=xx系统
DiskClusterSize = 512
LicenseFile=其它/协议声明.txt
OutputBaseFilename=xx_SetUp
SetupIconFile=其它/setup.ico
Compression=lzma
SolidCompression=yes
ExtraDiskSpaceRequired = 0
WindowVisible=yes
DisableProgramGroupPage=yes
ShowTasksTreeLines = yes

[Languages]
Name: "chinese"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "创建桌面快捷方式(&D)"; GroupDescription: "添加快捷方式:";

[Types]
Name:"full";Description:"完全安装"
Name:"custom";Description:"自定义安装";Flags:iscustom

[Components]
Name:"xx1";Description:"xx1";Types:full;ExtraDiskSpaceRequired:81920;Flags:disablenouninstallwarning
Name:"xx2设置";Description:"xx2设置";Types:full;ExtraDiskSpaceRequired:1933312;Flags:disablenouninstallwarning
Name:"xx3模块";Description:"xx3模块";Types:full;ExtraDiskSpaceRequired:2035712;Flags:disablenouninstallwarning
Name:"xx4模块";Description:"xx4模块";Types:full;ExtraDiskSpaceRequired:2179072;Flags:disablenouninstallwarning
Name:"xx5模块";Description:"xx5模块";Types:full;ExtraDiskSpaceRequired:3649536;Flags:disablenouninstallwarning
Name:"xx6模块";Description:"xx6模块";Types:full;ExtraDiskSpaceRequired:1908736;Flags:disablenouninstallwarning
Name:"xx7模块";Description:"xx7模块";Types:full;ExtraDiskSpaceRequired:1867776;Flags:disablenouninstallwarning

[Files]
Source: "FrameWork/dotnetfx.exe";DestDir: "{tmp}/FrameWork";Flags: ignoreversion promptifolder;AfterInstall:InstallFrame('{tmp}/FrameWork/dotnetfx.exe');
Source: "XX2/XX2.smf"; DestDir: "{app}/XX2模块"; Flags: ignoreversion promptifolder;Components:XX2
Source: "XX2/XX2.exe"; DestDir: "{app}/XX2模块"; Flags: ignoreversion promptifolder sortfilesbyextension;Components:XX2;AfterInstall:OpenFireWallAfterInstallSystem('{app}/XX2模块/XX2.exe');
Source: "Dll/mfc80u.dll";DestDir:"{app}/XX2模块";Flags:ignoreversion onlyifdoesntexist;Components:XX2
Source: "Dll/Microsoft.VC80.MFC.manifest";DestDir:"{app}/XX2模块";Flags:ignoreversion onlyifdoesntexist;Components:XX2
Source: "XX3系统/guide.smf"; DestDir: "{app}/XX3模块"; Flags: ignoreversion promptifolder;Components:XX3
Source: "XX3系统/XX3.exe"; DestDir: "{app}/XX3模块"; Flags: ignoreversion promptifolder sortfilesbyextension;Components:XX3;AfterInstall:OpenFireWallAfterInstallGuide('{app}/XX3模块/XX3.exe');
Source: "Dll/mfc80u.dll";DestDir:"{app}/XX3模块";Flags:ignoreversion onlyifdoesntexist;Components:XX3
Source: "Dll/Microsoft.VC80.MFC.manifest";DestDir:"{app}/XX3模块";Flags:ignoreversion onlyifdoesntexist;Components:XX3
Source: "XX4模块/XX4.smf"; DestDir: "{app}/XX4模块"; Flags: ignoreversion promptifolder;Components:XX4
Source: "XX4模块/BTPPrint.dll"; DestDir: "{app}/XX4模块"; Flags: ignoreversion promptifolder;Components:XX4
Source: "XX4模块/XX4.exe"; DestDir: "{app}/XX4模块"; Flags: ignoreversion promptifolder sortfilesbyextension;Components:XX4;AfterInstall:OpenFireWallAfterInstallSeafood('{app}/XX4模块/XX4.exe');
Source: "XX4模块/POSDLL.dll"; DestDir: "{app}/XX4模块"; Flags: ignoreversion promptifolder;Components:XX4
Source: "Dll/mfc80u.dll";DestDir:"{app}/XX4模块";Flags:ignoreversion onlyifdoesntexist;Components:XX4
Source: "Dll/Microsoft.VC80.MFC.manifest";DestDir:"{app}/XX4模块";Flags:ignoreversion onlyifdoesntexist;Components:XX4
Source: "XX1/caterServer.exe"; DestDir: "{sys}/CMSServer"; Flags: ignoreversion promptifolder;Components:cater_server;BeforeInstall:BeforeInstallServer('{sys}/CMSServer/caterServer.exe');AfterInstall:MyAfterInstall('{sys}/CMSServer/caterServer.exe');
Source: "XX5系统/POSDLL.dll"; DestDir: "{app}/XX5模块"; Flags: ignoreversion promptifolder;Components:XX5
Source: "XX5系统/account.smf"; DestDir: "{app}/XX5模块"; Flags: ignoreversion promptifolder;Components:XX5
Source: "XX5系统/XX5.exe"; DestDir: "{app}/XX5模块"; Flags: ignoreversion promptifolder sortfilesbyextension;Components:XX5;AfterInstall:OpenFireWallAfterInstallXX5('{app}/XX5模块/XX5.exe');
Source: "XX5系统/BTPPrint.dll"; DestDir: "{app}/XX5模块"; Flags: ignoreversion promptifolder;Components:XX5
Source: "Dll/mfc80u.dll";DestDir:"{app}/XX5模块";Flags:ignoreversion onlyifdoesntexist;Components:XX5
Source: "Dll/Microsoft.VC80.MFC.manifest";DestDir:"{app}/XX5模块";Flags:ignoreversion onlyifdoesntexist;Components:XX5
Source: "XX6系统/XX6.smf"; DestDir: "{app}/XX6模块"; Flags: ignoreversion promptifolder;Components:XX6
Source: "XX6系统/XX6.exe"; DestDir: "{app}/XX6模块"; Flags: ignoreversion promptifolder sortfilesbyextension;Components:XX6;AfterInstall:OpenFireWallAfterInstallXX6('{app}/XX6模块/XX6.exe');
Source: "Dll/mfc80u.dll";DestDir:"{app}/XX6模块";Flags:ignoreversion onlyifdoesntexist;Components:XX6
Source: "Dll/Microsoft.VC80.MFC.manifest";DestDir:"{app}/XX6模块";Flags:ignoreversion onlyifdoesntexist;Components:XX6
Source: "XX7系统/XX7.smf"; DestDir: "{app}/XX7模块"; Flags: ignoreversion promptifolder;Components:XX7
Source: "XX7系统/XX7.exe"; DestDir: "{app}/XX7模块"; Flags: ignoreversion promptifolder sortfilesbyextension;Components:XX7;AfterInstall:OpenFireWallAfterInstallHouse('{app}/XX7模块/XX7.exe');
Source: "Dll/mfc80u.dll";DestDir:"{app}/XX7模块";Flags:ignoreversion onlyifdoesntexist;Components:XX7
Source: "Dll/Microsoft.VC80.MFC.manifest";DestDir:"{app}/XX7模块";Flags:ignoreversion onlyifdoesntexist;Components:XX7
Source: "其它/CMS_HELP.doc"; DestDir: "{app}/其它"; Flags:ignoreversion sortfilesbyextension
Source: "其它/Readme.txt";DestDir: "{app}/其它"; Flags:isreadme
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”

[INI]
Filename: "{app}/xx.url"; Section: "InternetShortcut"; Key: "URL"; String: "http://www.xx.com.cn"

[Messages]
BeveledLabel=xx公司2007版权所有,保留所有权利.

[Registry]
Root:HKLM;SubKey:"Software/ODBC/ODBC.INI/CMS";Flags:deletevalue uninsdeletekey
Root:HKLM;SubKey:"Software/ODBC/ODBC.INI/CMS";ValueType:string;ValueName:"Driver";ValueData:"{sys}/sqlsrv32.dll";Flags:deletevalue uninsdeletekey
Root:HKLM;SubKey:"Software/ODBC/ODBC.INI/CMS";ValueType:string;ValueName:"LastUser";ValueData:"cmsuser";Flags:deletevalue uninsdeletekey
Root:HKLM;SubKey:"Software/ODBC/ODBC.INI/CMS";ValueType:string;ValueName:"Server";ValueData:{code:GetDataPage};Flags:deletevalue uninsdeletekey
Root:HKLM;SubKey:"Software/ODBC/ODBC.INI/ODBC Data Sources";ValueType:string;ValueName:"CMS";ValueData:"SQL Server";Flags:deletevalue uninsdeletevalue
Root:HKLM;SubKey:"Software/ODBC/ODBC.INI/CMS";ValueType:string;ValueName:"InitPath";ValueData:"{app}";Flags:deletevalue uninsdeletekey
Root:HKCU;SubKey:"Software/ODBC/ODBC.INI/CMS";Flags:deletevalue uninsdeletekey
Root:HKCU;SubKey:"Software/ODBC/ODBC.INI/CMS";ValueType:string;ValueName:"Driver";ValueData:"{sys}/sqlsrv32.dll";Flags:deletevalue uninsdeletekey
Root:HKCU;SubKey:"Software/ODBC/ODBC.INI/CMS";ValueType:string;ValueName:"LastUser";ValueData:"cmsuser";Flags:deletevalue uninsdeletekey
Root:HKCU;SubKey:"Software/ODBC/ODBC.INI/CMS";ValueType:string;ValueName:"Server";ValueData:{code:GetDataPage};Flags:deletevalue uninsdeletekey
Root:HKCU;SubKey:"Software/ODBC/ODBC.INI/ODBC Data Sources";ValueType:string;ValueName:"CMS";ValueData:"SQL Server";Flags:deletevalue uninsdeletevalue

[Icons]
Name: "{group}/{cm:UninstallProgram,xx系统}"; Filename: "{uninstallexe}"
Name: "{group}/{cm:ProgramOnTheWeb,xx有限公司}"; Filename: "{app}/xx.url"
Name: "{group}/xxx帮助文档"; Filename: "{app}/CMS_HELP.doc"; Flags:createonlyiffileexists;WorkingDir:"{app}"
Name: "{group}/XX2"; Filename: "{app}/XX2模块/XX2.exe"; Flags:createonlyiffileexists;WorkingDir:"{app}/XX2模块"
Name: "{group}/XX3模块"; Filename: "{app}/XX3模块/XX3.exe"; Flags:createonlyiffileexists;WorkingDir:"{app}/XX3模块"
Name: "{group}/XX4模块"; Filename: "{app}/XX4模块/XX4.exe"; Flags:createonlyiffileexists;WorkingDir:"{app}/XX4模块"
Name: "{group}/XX5模块"; Filename: "{app}/XX5模块/XX5.exe"; Flags:createonlyiffileexists ;WorkingDir:"{app}/XX5模块"
Name: "{group}/XX6模块"; Filename: "{app}/XX6模块/XX6.exe"; Flags:createonlyiffileexists;WorkingDir:"{app}/XX6模块"
Name: "{group}/XX7模块"; Filename: "{app}/XX7模块/XX7.exe"; Flags:createonlyiffileexists;WorkingDir:"{app}/XX7模块"
Name: "{userdesktop}/XX2"; Filename: "{app}/XX2模块/XX2.exe"; Tasks: desktopicon; Flags:createonlyiffileexists;WorkingDir:"{app}/XX2模块"
Name: "{userdesktop}/XX3模块"; Filename: "{app}/XX3模块/XX3.exe"; Tasks: desktopicon; Flags:createonlyiffileexists;WorkingDir:"{app}/XX3模块"
Name: "{userdesktop}/XX4模块"; Filename: "{app}/XX4模块/XX4.exe"; Tasks: desktopicon; Flags:createonlyiffileexists;WorkingDir:"{app}/XX4模块"
Name: "{userdesktop}/XX5模块"; Filename: "{app}/XX5模块/XX5.exe"; Tasks: desktopicon; Flags:createonlyiffileexists ;WorkingDir:"{app}/XX5模块"
Name: "{userdesktop}/XX6模块"; Filename: "{app}/XX6模块/XX6.exe"; Tasks: desktopicon; Flags:createonlyiffileexists ;WorkingDir:"{app}/XX6模块"
Name: "{userdesktop}/XX7模块"; Filename: "{app}/XX7模块/XX7.exe"; Tasks: desktopicon; Flags:createonlyiffileexists;WorkingDir:"{app}/XX7模块"

[UninstallDelete]
Type: files; Name: "{app}/xx.url"
Type: filesandordirs; Name: "{sys}/CMSServer";
Type: filesandordirs; Name: "{app}";

[Code]
{安装XX1程序前先停止服务}
var
    ErrorCodes: Integer;
procedure BeforeInstallServer(FileName:string);
begin
    ShellExec('open','sc','stop CMSserver','',SW_HIDE,ewNoWait,ErrorCodes);
    Sleep(2000);
    ShellExec('open','sc','delete CMSserver','',SW_HIDE,ewNoWait,ErrorCodes);
    Sleep(1000);
end;
{安装XX1程序后启动服务及打开防火墙允许程序通过}
var
    ErrorCode: Integer;
procedure MyAfterInstall(FileName:string);
var
    sPathServerExe: string;
    sPathServer: string;
    sPathServerFirewall: string;
begin
    sPathServerExe := ExpandConstant('"{sys}/CMSServer/caterServer.exe"');
    sPathServerExe := 'create CMSserver binpath= ' + sPathServerExe;
    sPathServer := ExpandConstant('"{sys}/CMSServer/"');
    sPathServerFirewall := ExpandConstant('"{sys}/CMSServer/caterServer.exe"');
    sPathServerFirewall := 'firewall set allowedprogram ' + sPathServerFirewall + ' CMSServer ENABLE';
    ShellExec('open','sc',sPathServerExe,sPathServer,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(1000);
    ShellExec('open','sc','config CMSserver depend= MSSQLSERVER','',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(1000);
    ShellExec('open','sc','config CMSserver start= auto','',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(1000);
    ShellExec('open','sc','start CMSserver','',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(2000);
    ShellExec('open','netsh','firewall set portopening TCP 1433 SQLServer ENABLE','',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    ShellExec('open','netsh',sPathServerFirewall,sPathServer,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    //用于判断是否已经安装过该模块
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS','ServerFlag','001server');
end;

{XX2模块安装时,在防火墙中设置为例外程序}
procedure OpenFireWallAfterInstallSystem(FileName:string);
var
    sPathSysSet: string;
    sPathSysSetExe: string;
begin
    sPathSysSetExe := ExpandConstant('"{app}/XX2模块/XX2.exe"');
    sPathSysSetExe := 'firewall set allowedprogram ' + sPathSysSetExe + ' CMSXX2 ENABLE';
    sPathSysSet := ExpandConstant('"{app}/XX2模块/"');
    ShellExec('open','netsh',sPathSysSetExe,sPathSysSet,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    //用于判断是否已经安装过该模块
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS','SysSetFlag','002sysset');
end;
{XX3模块安装时,在防火墙中设置为例外程序}
procedure OpenFireWallAfterInstallGuide(FileName:string);
var
    sPathGuide: string;
    sPathGuideExe: string;
begin
    sPathGuideExe := ExpandConstant('"{app}/XX3模块/XX3.exe"');
    sPathGuideExe := 'firewall set allowedprogram ' + sPathGuideExe + ' CMSXX3模块 ENABLE';
    sPathGuide := ExpandConstant('"{app}/XX3模块/"');
    ShellExec('open','netsh',sPathGuideExe,sPathGuide,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    //用于判断是否已经安装过该模块
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS','GuideFlag','003guide');
end;
{XX4模块安装时,在防火墙中设置为例外程序}
procedure OpenFireWallAfterInstallSeafood(FileName:string);
var
    sPathSeafood: string;
    sPathSeafoodExe: string;
begin
    sPathSeafoodExe := ExpandConstant('"{app}/XX4模块/XX4.exe"');
    sPathSeafoodExe := 'firewall set allowedprogram ' + sPathSeafoodExe + ' CMSXX4模块 ENABLE';
    sPathSeafood := ExpandConstant('"{app}/XX4模块/"');
    ShellExec('open','netsh',sPathSeafoodExe,sPathSeafood,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    //用于判断是否已经安装过该模块
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS','OtherFlag','004other');
end;
{XX5模块安装时,在防火墙中设置为例外程序}
procedure OpenFireWallAfterInstallXX5(FileName:string);
var
    sPathXX5: string;
    sPathXX5Exe: string;
begin
    sPathXX5Exe := ExpandConstant('"{app}/XX5模块/XX5.exe"');
    sPathXX5Exe := 'firewall set allowedprogram ' + sPathXX5Exe + ' CMSXX5模块 ENABLE';
    sPathXX5 := ExpandConstant('"{app}/XX5模块/"');
    ShellExec('open','netsh',sPathXX5Exe,sPathXX5,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    //用于判断是否已经安装过该模块
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS','AccountFlag','005account');
end;
{XX6模块安装时,在防火墙中设置为例外程序}
procedure OpenFireWallAfterInstallXX6(FileName:string);
var
  sPathXX6Exe:string;
  sPathXX6:string;
begin
    sPathXX6 := ExpandConstant('"{app}/XX6模块/"');
    sPathXX6Exe := ExpandConstant('"{app}/XX6模块/XX6.exe"');
    sPathXX6Exe := 'firewall set allowedprogram ' + sPathXX6Exe + ' CMSXX6模块 ENABLE';
    ShellExec('open','netsh',sPathXX6Exe,sPathXX6,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    //用于判断是否已经安装过该模块
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS','XX6Flag','006bksms');
end;
{XX7模块安装时,在防火墙中设置为例外程序}
procedure OpenFireWallAfterInstallHouse(FileName:string);
var
    sPathXX7:string;
    sPathXX7Exe:string;
begin
    sPathXX7Exe := ExpandConstant('"{app}/XX7模块/XX7.exe"');
    sPathXX7Exe := 'firewall set allowedprogram ' + sPathXX7Exe + ' CMSXX7模块 ENABLE';
    sPathXX7 := ExpandConstant('"{app}/XX7模块/"');
    ShellExec('open','netsh',sPathXX7Exe,sPathXX7,SW_HIDE,ewNoWait,ErrorCode);
    Sleep(800);
    //用于判断是否已经安装过该模块
    RegWriteStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS','XX7Flag','007warehouse');
end;

{安装前初始化Page输入页面}
var
    Page: TInputQueryWizardPage;
    ServerIP:string;
procedure InitializeWizard;
begin
    ServerIP := ''
    Page := CreateInputQueryPage(wpSelectComponents, '配置本地数据源','用于本机程序连接XX1', '输入要连接的数据库XX1IP地址');
    Page.Add('XX1IP(如 192.168.0.1):',False);
    RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'Server',ServerIP);
    Page.Values[0] := ServerIP;
end;

{以‘.’分4段判断IP地址格式是否正确}
function CheckIP(IpValue:string):Boolean;
var
    ArrayIP:string;
    i:Integer;
    j:Integer;
    S:string;
    S1:string;
    S2:string;
    S3:string;
    MidValue:string;
    MidValue1:string;
    MidValue2:string;
    MidValue3:string;
    Result0:Boolean;
    Result1:Boolean;
    Result2:Boolean;
    Result3:Boolean;
begin
    S := ''
    S1 := ''
    S2 := ''
    S3 := ''
    MidValue := ''
    MidValue1 := ''
    MidValue2 := ''
    MidValue3 := ''
    ArrayIP := IpValue;
    //判断第1段值位于0--255
    for i:= 1 to length(ArrayIP) do
    if ArrayIP[i] = '.' then
    begin
        j := i;
    for i:= j+1 to length(ArrayIP) do
    begin
        MidValue := MidValue + ArrayIP[i];
    end;
    for i:= 1 to j-1 do
        S := S + ArrayIP[i];
        if StrToIntDef(S,-1) >= 0 then
        begin
             if StrToIntDef(S,-1) <= 255 then
             begin
                  Result0 := True;
             end else begin
                  Result0 := False;
             end;
        end else begin
             Result0 := False;
        end;
        break;
    end;
    //判断第2段值位于0--255
    for i:= 1 to length(MidValue) do
    if MidValue[i] = '.' then
    begin
        j:= i;
        for i:= j+1 to length(MidValue) do
    begin
        MidValue1 := MidValue1 + MidValue[i];
    end;
    for i:= 1 to j-1 do
        S1 := S1 + MidValue[i];
        if StrToIntDef(S1,-1) >= 0 then
        begin
             if StrToIntDef(S1,-1) <= 255 then
             begin
                  Result1 := True;
             end else begin
                  Result1 := False;
             end;
        end else begin
             Result1 := False;
        end;
        break;
    end;
    //判断第3段值位于0--255
    for i:= 1 to length(MidValue1) do
    if MidValue1[i] = '.' then
    begin
        j:= i;
        for i:= j+1 to length(MidValue1) do
    begin
        MidValue2 := MidValue2 + MidValue1[i];
    end;
    for i:= 1 to j-1 do
        S2 := S2 + MidValue1[i];
        if StrToIntDef(S2,-1) >= 0 then
        begin
             if StrToIntDef(S2,-1) <= 255 then
             begin
                  Result2 := True;
             end else begin
                  Result2 := False;
             end;
        end else begin
             Result2 := False;
        end;
        break;
    end;
    //判断第4段位于0--255
    if StrToIntDef(MidValue2,-1) >= 0then
    begin
         if StrToIntDef(MidValue2,-1) <= 255 then
         begin
              Result3 := True;
         end else begin
              Result3 := False;
         end;
    end else begin
         Result3 := False;
    end;
    if ( Result0 = True ) then
    begin
         if ( Result1 = True ) then
         begin
              if( Result2 = True ) then
              begin
                   if( Result3 = True ) then
                   begin
                        Result := True;
                   end else begin
                        Result := False;
                   end;
              end else begin
                   Result := False;
              end;
         end else begin
              Result := False;
         end;
    end else begin
        Result := False;
    end;
end;

{用于判断Page页面的输入框是否为空及判断是否选择的模块为空及某模块是否已经安装}
function NextButtonClick(CurPageID: Integer): Boolean;
var
    ServerFlag:string;
    SysSetFlag:string;
    GuideFlag:string;
    OtherFlag:string;
    AccountFlag:string;
    XX6Flag:string;
    XX7Flag:string;
    strInfo:string;
    selectComponents:string;
begin
    if( CurPageID = Page.ID ) then
    begin
        if( Page.Values[0] = '' ) then
        begin
             MsgBox('IP地址不能为空,必须输入数据库XX1的IP地址!',mbError,MB_OK);
             Result := False;
        end
        else if ( CheckIP(Page.Values[0]) = False ) then
        begin
             MsgBox('IP地址不正确,请重新输入!',mbError,MB_OK);
             Result := False;
        end else begin
             if MsgBox('您输入的IP地址是' + Page.Values[0] + ',继续请按[是],取消请按[否]!', mbConfirmation, MB_YESNO ) = IDYES then begin
             Result := True;
             end else begin
             Result := False;
             end;
        end;
    end
    else if ( CurPageID = wpSelectComponents ) then
    begin//begin
       strInfo := ''
       selectComponents := WizardSelectedComponents(false);
       if ( selectComponents = '' ) then begin
            MsgBox('必须选择一个模块进行安装!',mbError,MB_OK);
            Result := False;
       end else
       begin
            if ( pos('cater_server',selectComponents) > 0 ) then
            begin
                 RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'ServerFlag',ServerFlag);
                 if ServerFlag = '001server' then
                 begin
                      strInfo := strInfo + '          ' + 'XX1' + #10 + #10;
                 end
                 else begin
                      strInfo := strInfo;
                 end
            end
            if ( pos('cmssyssetting',WizardSelectedComponents(false)) > 0 ) then
            begin
                 RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'SysSetFlag',SysSetFlag);
                 if SysSetFlag = '002sysset' then
                 begin
                      strInfo := strInfo + '          ' + 'XX2'+ #10 + #10;
                 end
                 else begin
                      strInfo := strInfo;
                 end
            end
            if ( pos('cateringguide',WizardSelectedComponents(false)) > 0 ) then
            begin
                 RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'GuideFlag',GuideFlag);
                 if GuideFlag = '003guide' then
                 begin
                      strInfo := strInfo + '          ' + 'XX3模块' + #10 + #10;
                 end
                 else begin
                      strInfo := strInfo;
                 end
            end
            if ( pos('cateringservice',WizardSelectedComponents(false)) > 0 ) then
            begin
                 RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'OtherFlag',OtherFlag);
                 if OtherFlag = '004other' then
                 begin
                      strInfo := strInfo + '          ' + 'XX4模块' + #10 + #10;
                 end
                 else begin
                      strInfo := strInfo;
                 end
            end
            if ( pos('acount',WizardSelectedComponents(false)) > 0 ) then
            begin
                 RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'AccountFlag',AccountFlag);
                 if AccountFlag = '005account' then
                 begin
                      strInfo := strInfo + '          ' + 'XX5模块' + #10 + #10;
                 end
                 else begin
                      strInfo := strInfo;
                 end
            end
            if ( pos('bksms',WizardSelectedComponents(false)) > 0 ) then
            begin
                 RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'XX6Flag',XX6Flag);
                 if XX6Flag = '006bksms' then
                 begin
                      strInfo := strInfo + '          ' + 'XX6模块' + #10 + #10;
                 end
                 else begin
                      strInfo := strInfo;
                 end
            end
            if ( pos('warehouse',WizardSelectedComponents(false)) > 0 ) then
            begin
                 RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'XX7Flag',XX7Flag);
                 if XX7Flag = '007warehouse' then
                 begin
                      strInfo := strInfo + '          ' + 'XX7模块' + #10 + #10;
                 end
                 else begin
                      strInfo := strInfo;
                 end
            end
            //判断
            if strInfo <> '' then
            begin
                 if Msgbox( '安装程序发现下列模块已经安装:'+ #10 + #10 + strInfo + '再次安装将覆盖已存在模块,无论如何也要继续吗?',mbConfirmation,MB_YESNO) = IDYES then
                 begin
                      Result := True;
                 end
                 else
                 begin
                      Result := False;
                 end
            end
            else begin
                 Result := True;
            end
       end;
    end//end
    else begin
    Result := True;
    end;
end;

{如果本机已经安装过该系统,则跳过选择路径页面}
function ShouldSkipPage(PageID: Integer): Boolean;
begin
    Result := False;
    if PageID = wpSelectDir then
    begin
         if RegKeyExists(HKEY_CURRENT_USER, 'Software/ODBC/ODBC.INI/CMS') then
            Result := True;
    end;
end;

{获取Page页面输入框中的输入IP值}
function GetDataPage(Param: String): String;
begin
  { Return the IP }
      Result := Page.Values[0];
end;

{卸载前初始化}
function InitializeUninstall(): Boolean;
begin
    Result := True;
end;

{自定义函数,在确定删除程序后首先把防火墙中的例外程序删除}
function UninstallTrue(Param:string):string;
var
    sPathDeleteServer:string;
    sPathDSysSet:string;
    sPathDGuide:string;
    sPathDSeafood:string;
    sPathDAccount:string;
    sPathDBks:string;
    sPathDWarehouse:string;
begin
    {停止并删除XX1服务,把该XX1程序从防火墙的例外中删除}
    sPathDeleteServer := ExpandConstant('"{sys}/CMSServer/caterServer.exe"');
    sPathDeleteServer := 'firewall delete allowedprogram ' + sPathDeleteServer;
    sPathDSysSet := ExpandConstant('"{app}/XX2模块/XX2.exe"');
    sPathDSysSet := 'firewall delete allowedprogram ' + sPathDSysSet;
    sPathDGuide := ExpandConstant('"{app}/XX3模块/XX3.exe"');
    sPathDGuide := 'firewall delete allowedprogram ' + sPathDGuide;
    sPathDSeafood := ExpandConstant('"{app}/XX4模块/XX4.exe"');
    sPathDSeafood := 'firewall delete allowedprogram ' + sPathDSeafood;
    sPathDAccount := ExpandConstant('"{app}/XX5模块/XX5.exe"');
    sPathDAccount := 'firewall delete allowedprogram ' + sPathDAccount;
    sPathDBks := ExpandConstant('"{app}/XX6模块/XX6.exe"');
    sPathDBks := 'firewall delete allowedprogram ' + sPathDBks;
    sPathDWarehouse := ExpandConstant('"{app}/XX7模块/XX7.exe"');
    sPathDWarehouse := 'firewall delete allowedprogram ' + sPathDWarehouse;
    ShellExec('open','netsh','firewall delete portopening TCP 1433','',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    ShellExec('open','netsh',sPathDeleteServer,'',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    ShellExec('open','sc','stop CMSserver','',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(1000);
    ShellExec('open','sc','delete CMSserver','',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    {把XX2程序从防火墙的例外中删除}
    ShellExec('open','netsh',sPathDSysSet,'',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    {把XX3程序从防火墙的例外中删除}
    ShellExec('open','netsh',sPathDGuide,'',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    {把XX4模块的程序从防火墙的例外中删除}
    ShellExec('open','netsh',sPathDSeafood,'',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    {把XX5程序从防火墙的例外中删除}
    ShellExec('open','netsh',sPathDAccount,'',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    {把XX6程序从防火墙的例外中删除}
    ShellExec('open','netsh',sPathDBks,'',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
    {把XX7程序从防火墙的例外中删除}
    ShellExec('open','netsh',sPathDWarehouse,'',SW_HIDE,ewNoWait,ErrorCode);
    Sleep(500);
end;

{当确定卸载时,开始执行}
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case CurUninstallStep of
        usUninstall:
        begin
             UninstallTrue('');
        end;
     end;
end;

{当前安装未完成,点取消按钮,在提示框中选择确定时把已经安装的部分全部删除}
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
    if( CurPageID = wpInstalling ) then
    begin
          Cancel := False;
          Confirm := False;
          if( ExitSetupMsgBox = True ) then
          begin
              if RegKeyExists(HKEY_CURRENT_USER, 'Software/ODBC/ODBC.INI/CMS') then
              begin
                    Cancel := True;
                    Confirm := False;
              end
              else begin
              UninstallTrue('');
              RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE,'Software/ODBC/ODBC.INI/CMS');
              Cancel := True;
              Confirm := False;
              end
          end;
    end;
end;

{安装路径:如果未安装,默认路径,如果已经安装过,使用原路径覆盖}
function GetInitPath(Param:string): String;
var InitPath:string;
begin
    if RegKeyExists(HKEY_CURRENT_USER, 'Software/ODBC/ODBC.INI/CMS') then
    begin
         RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software/ODBC/ODBC.INI/CMS', 'InitPath',InitPath);
         Result := InitPath;
    end
    else
    begin
         Result := ExpandConstant('{pf}/餐饮管理系统');
    end;
end;

{安装前判断所安装的机器是否有Framework,如果有,则不安装,没有,则先安装Framework}
Procedure InstallFrame(FileName:string);
var ResultCode:Integer;
begin
    if RegKeyExists(HKEY_LOCAL_MACHINE,'Software/Microsoft/.NETFramework') then
    begin
    end
    else begin
       if Msgbox('安装程序检测到本机尚未安装FrameWork,为确保程序正确运行,请点击确定按钮完成FrameWork的安装!',mbConfirmation,MB_OKCANCEL) = IDOK then
       begin
           if not ShellExec('open',ExpandConstant('"{tmp}/FrameWork/dotnetfx.exe"'),'',ExpandConstant('"{tmp}/FrameWork/"'),SW_SHOW,ewWaitUntilTerminated, ResultCode) then
           begin
           SysErrorMessage(ResultCode);
           end
       end
       else begin
          Msgbox('FrameWork未安装,安装程序可能不能正确运行!',mbConfirmation,MB_OK);
       end
    end;
end;
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值