Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

In need of a Pascal script for an installer

MrRadicalEdMrRadicalEd Posts: 3Member
[b][red]This message was edited by MrRadicalEd at 2005-2-12 14:32:55[/red][/b][hr]
I'm currently writing an installer script with Inno Setup that can use Pascal scripts for more functionality, but isn't required to actually make a decent installer. Anyway I had run in to a problem that requires a Pascal script, and while I am highly interested in learning Pascal I am actually focused on getting this installer completed to get this side project out the door.

In my installer script file I have a line like this:
Source: C:MFCMprojectGame Directoriescounter-strikecstrikeMFCMmfcm.cfg; DestDir: {reg:HKCUSOFTWAREValveSteam,ModInstallPath}counter-strikecstrikeMFCM

The source file's destination directory is read from an existing registry entry. The problem is that the path read from the registry key is too long and an extra directory needs to be removed at the end.

the entry ModInstallPath is "c:program filesvalvesteamsteamappsemail@address.nethalf-life"

and needs to look like:
"c:program filesvalvesteamsteamappsemail@address.net"

The way Pascal code is inserted in to the installer script is by placing Open Bracket"["Code"]"Close Bracket in the script and using the constant {code:...} where you need to use the function

so instead of {reg:HKxx...} it would be {code:function...} The function being the script needed.

Help with this matter would be very greatly appreciated and would installer help would be included in the credits

Comments

  • zibadianzibadian Posts: 6,349Member
    : [b][red]This message was edited by MrRadicalEd at 2005-2-12 14:32:55[/red][/b][hr]
    : I'm currently writing an installer script with Inno Setup that can use Pascal scripts for more functionality, but isn't required to actually make a decent installer. Anyway I had run in to a problem that requires a Pascal script, and while I am highly interested in learning Pascal I am actually focused on getting this installer completed to get this side project out the door.
    :
    : In my installer script file I have a line like this:
    : Source: C:MFCMprojectGame Directoriescounter-strikecstrikeMFCMmfcm.cfg; DestDir: {reg:HKCUSOFTWAREValveSteam,ModInstallPath}counter-strikecstrikeMFCM
    :
    : The source file's destination directory is read from an existing registry entry. The problem is that the path read from the registry key is too long and an extra directory needs to be removed at the end.
    :
    : the entry ModInstallPath is "c:program filesvalvesteamsteamappsemail@address.nethalf-life"
    :
    : and needs to look like:
    : "c:program filesvalvesteamsteamappsemail@address.net"
    :
    : The way Pascal code is inserted in to the installer script is by placing Open Bracket"["Code"]"Close Bracket in the script and using the constant {code:...} where you need to use the function
    :
    : so instead of {reg:HKxx...} it would be {code:function...} The function being the script needed.
    :
    : Help with this matter would be very greatly appreciated and would installer help would be included in the credits
    :
    Here is a code to remove the last subdirectory. It is based on Turbo Pascal and might not work in the Installer Pascal:
    [code]
    if SubDir[Length(SubDir)] = '' then
    Delete(SubDir, Length(SubDir), 1); { Remove trailing backslash, if any }
    while SubDir[Length(SubDir)] <> '' do
    Delete(SubDir, Length(SubDir), 1); { Remove all until the next backslash }
    Delete(SubDir, Length(SubDir), 1); { Remove the backslash }
    [/code]
    The parts between the {} are comments to indicate what that statement does.
  • MrRadicalEdMrRadicalEd Posts: 3Member
    Thanks for the reply, but when I compiled it I got an error:
    "Unknown identifier SubDir"

    This is an example script from an example file:

    var
    MyProgChecked: Boolean;
    MyProgCheckResult: Boolean;
    FinishedInstall: Boolean;

    function InitializeSetup(): Boolean;
    begin
    Result := MsgBox('InitializeSetup:' #13#13 'Setup is initializing. Do you really want to start setup?', mbConfirmation, MB_YESNO) = idYes;
    if Result = False then
    MsgBox('InitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
    end;

    procedure DeinitializeSetup();
    var
    FileName: String;
    ResultCode: Integer;
    begin
    if FinishedInstall then begin
    if MsgBox('DeinitializeSetup:' #13#13 'The [Code] scripting demo has finished. Do you want to uninstall My Program now?', mbConfirmation, MB_YESNO) = idYes then begin
    FileName := ExpandConstant('{uninstallexe}');
    if not Exec(FileName, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then
    MsgBox('DeinitializeSetup:' #13#13 'Execution of ''' + FileName + ''' failed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
    end else
    MsgBox('DeinitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
    end;
    end;

    procedure CurStepChanged(CurStep: TSetupStep);
    begin
    if CurStep = ssPostInstall then
    FinishedInstall := True;
    end;

    function NextButtonClick(CurPageID: Integer): Boolean;
    var
    ResultCode: Integer;
    begin
    case CurPageID of
    wpSelectDir:
    MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardDirValue + '''.', mbInformation, MB_OK);
    wpSelectProgramGroup:
    MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardGroupValue + '''.', mbInformation, MB_OK);
    wpReady:
    begin
    if MsgBox('NextButtonClick:' #13#13 'Using the script, files can now be extracted before the installation starts. For example we could extract ''MyProg.exe'' now and run it.' #13#13 'Do you want to do this?', mbConfirmation, MB_YESNO) = idYes then begin
    ExtractTemporaryFile('myprog.exe');
    if not Exec(ExpandConstant('{tmp}myprog.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
    MsgBox('NextButtonClick:' #13#13 'The file could not be executed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
    end;
    BringToFrontAndRestore();
    MsgBox('NextButtonClick:' #13#13 'The normal installation will now start.', mbInformation, MB_OK);
    end;
    end;

    Result := True;
    end;

    function ShouldSkipPage(PageID: Integer): Boolean;
    begin
    { Skip wpInfoBefore page; show all others }
    case PageID of
    wpInfoBefore:
    Result := True;
    else
    Result := False;
    end;
    end;

    procedure CurPageChanged(CurPageID: Integer);
    begin
    case CurPageID of
    wpWelcome:
    MsgBox('CurPageChanged:' #13#13 'Welcome to the [Code] scripting demo. This demo will show you some possibilities of the scripting support.' #13#13 'The scripting engine used is RemObjects Pascal Script by Carlo Kok. See http://www.remobjects.com/?ps for more information.', mbInformation, MB_OK);
    wpFinished:
    MsgBox('CurPageChanged:' #13#13 'Welcome to final page of this demo. Click Finish to exit.', mbInformation, MB_OK);
    end;
    end;

    function MyProgCheck(): Boolean;
    begin
    if not MyProgChecked then begin
    MyProgCheckResult := MsgBox('MyProg:' #13#13 'Do you want to install MyProg.exe and MyProg.hlp to ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = idYes;
    MyProgChecked := True;
    end;
    Result := MyProgCheckResult;
    end;

    procedure BeforeMyProgInstall(S: String);
    begin
    MsgBox('BeforeMyProgInstall:' #13#13 'Setup is now going to install ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK);
    end;

    procedure AfterMyProgInstall(S: String);
    begin
    MsgBox('AfterMyProgInstall:' #13#13 'Setup just installed ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK);
    end;

    function MyConst(Param: String): String;
    begin
    Result := ExpandConstant('{pf}');
    end;
  • MrRadicalEdMrRadicalEd Posts: 3Member
    Thanks for the reply, but when I compiled it I got an error:
    "Unknown identifier SubDir"

    This is an example script from an example file:
    [code]
    var
    MyProgChecked: Boolean;
    MyProgCheckResult: Boolean;
    FinishedInstall: Boolean;

    function InitializeSetup(): Boolean;
    begin
    Result := MsgBox('InitializeSetup:' #13#13 'Setup is initializing. Do you really want to start setup?', mbConfirmation, MB_YESNO) = idYes;
    if Result = False then
    MsgBox('InitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
    end;

    procedure DeinitializeSetup();
    var
    FileName: String;
    ResultCode: Integer;
    begin
    if FinishedInstall then begin
    if MsgBox('DeinitializeSetup:' #13#13 'The [Code] scripting demo has finished. Do you want to uninstall My Program now?', mbConfirmation, MB_YESNO) = idYes then begin
    FileName := ExpandConstant('{uninstallexe}');
    if not Exec(FileName, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then
    MsgBox('DeinitializeSetup:' #13#13 'Execution of ''' + FileName + ''' failed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
    end else
    MsgBox('DeinitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
    end;
    end;

    procedure CurStepChanged(CurStep: TSetupStep);
    begin
    if CurStep = ssPostInstall then
    FinishedInstall := True;
    end;

    function NextButtonClick(CurPageID: Integer): Boolean;
    var
    ResultCode: Integer;
    begin
    case CurPageID of
    wpSelectDir:
    MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardDirValue + '''.', mbInformation, MB_OK);
    wpSelectProgramGroup:
    MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardGroupValue + '''.', mbInformation, MB_OK);
    wpReady:
    begin
    if MsgBox('NextButtonClick:' #13#13 'Using the script, files can now be extracted before the installation starts. For example we could extract ''MyProg.exe'' now and run it.' #13#13 'Do you want to do this?', mbConfirmation, MB_YESNO) = idYes then begin
    ExtractTemporaryFile('myprog.exe');
    if not Exec(ExpandConstant('{tmp}myprog.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
    MsgBox('NextButtonClick:' #13#13 'The file could not be executed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
    end;
    BringToFrontAndRestore();
    MsgBox('NextButtonClick:' #13#13 'The normal installation will now start.', mbInformation, MB_OK);
    end;
    end;

    Result := True;
    end;

    function ShouldSkipPage(PageID: Integer): Boolean;
    begin
    { Skip wpInfoBefore page; show all others }
    case PageID of
    wpInfoBefore:
    Result := True;
    else
    Result := False;
    end;
    end;

    procedure CurPageChanged(CurPageID: Integer);
    begin
    case CurPageID of
    wpWelcome:
    MsgBox('CurPageChanged:' #13#13 'Welcome to the [Code] scripting demo. This demo will show you some possibilities of the scripting support.' #13#13 'The scripting engine used is RemObjects Pascal Script by Carlo Kok. See http://www.remobjects.com/?ps for more information.', mbInformation, MB_OK);
    wpFinished:
    MsgBox('CurPageChanged:' #13#13 'Welcome to final page of this demo. Click Finish to exit.', mbInformation, MB_OK);
    end;
    end;

    function MyProgCheck(): Boolean;
    begin
    if not MyProgChecked then begin
    MyProgCheckResult := MsgBox('MyProg:' #13#13 'Do you want to install MyProg.exe and MyProg.hlp to ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = idYes;
    MyProgChecked := True;
    end;
    Result := MyProgCheckResult;
    end;

    procedure BeforeMyProgInstall(S: String);
    begin
    MsgBox('BeforeMyProgInstall:' #13#13 'Setup is now going to install ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK);
    end;

    procedure AfterMyProgInstall(S: String);
    begin
    MsgBox('AfterMyProgInstall:' #13#13 'Setup just installed ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK);
    end;

    function MyConst(Param: String): String;
    begin
    Result := ExpandConstant('{pf}');
    end;
    [/code]
  • zibadianzibadian Posts: 6,349Member
    : Thanks for the reply, but when I compiled it I got an error:
    : "Unknown identifier SubDir"
    :
    : This is an example script from an example file:
    : [code]
    : var
    : MyProgChecked: Boolean;
    : MyProgCheckResult: Boolean;
    : FinishedInstall: Boolean;
    :
    : function InitializeSetup(): Boolean;
    : begin
    : Result := MsgBox('InitializeSetup:' #13#13 'Setup is initializing. Do you really want to start setup?', mbConfirmation, MB_YESNO) = idYes;
    : if Result = False then
    : MsgBox('InitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
    : end;
    :
    : procedure DeinitializeSetup();
    : var
    : FileName: String;
    : ResultCode: Integer;
    : begin
    : if FinishedInstall then begin
    : if MsgBox('DeinitializeSetup:' #13#13 'The [Code] scripting demo has finished. Do you want to uninstall My Program now?', mbConfirmation, MB_YESNO) = idYes then begin
    : FileName := ExpandConstant('{uninstallexe}');
    : if not Exec(FileName, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then
    : MsgBox('DeinitializeSetup:' #13#13 'Execution of ''' + FileName + ''' failed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
    : end else
    : MsgBox('DeinitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
    : end;
    : end;
    :
    : procedure CurStepChanged(CurStep: TSetupStep);
    : begin
    : if CurStep = ssPostInstall then
    : FinishedInstall := True;
    : end;
    :
    : function NextButtonClick(CurPageID: Integer): Boolean;
    : var
    : ResultCode: Integer;
    : begin
    : case CurPageID of
    : wpSelectDir:
    : MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardDirValue + '''.', mbInformation, MB_OK);
    : wpSelectProgramGroup:
    : MsgBox('NextButtonClick:' #13#13 'You selected: ''' + WizardGroupValue + '''.', mbInformation, MB_OK);
    : wpReady:
    : begin
    : if MsgBox('NextButtonClick:' #13#13 'Using the script, files can now be extracted before the installation starts. For example we could extract ''MyProg.exe'' now and run it.' #13#13 'Do you want to do this?', mbConfirmation, MB_YESNO) = idYes then begin
    : ExtractTemporaryFile('myprog.exe');
    : if not Exec(ExpandConstant('{tmp}myprog.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
    : MsgBox('NextButtonClick:' #13#13 'The file could not be executed. ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
    : end;
    : BringToFrontAndRestore();
    : MsgBox('NextButtonClick:' #13#13 'The normal installation will now start.', mbInformation, MB_OK);
    : end;
    : end;
    :
    : Result := True;
    : end;
    :
    : function ShouldSkipPage(PageID: Integer): Boolean;
    : begin
    : { Skip wpInfoBefore page; show all others }
    : case PageID of
    : wpInfoBefore:
    : Result := True;
    : else
    : Result := False;
    : end;
    : end;
    :
    : procedure CurPageChanged(CurPageID: Integer);
    : begin
    : case CurPageID of
    : wpWelcome:
    : MsgBox('CurPageChanged:' #13#13 'Welcome to the [Code] scripting demo. This demo will show you some possibilities of the scripting support.' #13#13 'The scripting engine used is RemObjects Pascal Script by Carlo Kok. See http://www.remobjects.com/?ps for more information.', mbInformation, MB_OK);
    : wpFinished:
    : MsgBox('CurPageChanged:' #13#13 'Welcome to final page of this demo. Click Finish to exit.', mbInformation, MB_OK);
    : end;
    : end;
    :
    : function MyProgCheck(): Boolean;
    : begin
    : if not MyProgChecked then begin
    : MyProgCheckResult := MsgBox('MyProg:' #13#13 'Do you want to install MyProg.exe and MyProg.hlp to ' + ExtractFilePath(CurrentFileName) + '?', mbConfirmation, MB_YESNO) = idYes;
    : MyProgChecked := True;
    : end;
    : Result := MyProgCheckResult;
    : end;
    :
    : procedure BeforeMyProgInstall(S: String);
    : begin
    : MsgBox('BeforeMyProgInstall:' #13#13 'Setup is now going to install ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK);
    : end;
    :
    : procedure AfterMyProgInstall(S: String);
    : begin
    : MsgBox('AfterMyProgInstall:' #13#13 'Setup just installed ' + S + ' as ' + CurrentFileName + '.', mbInformation, MB_OK);
    : end;
    :
    : function MyConst(Param: String): String;
    : begin
    : Result := ExpandConstant('{pf}');
    : end;
    : [/code]
    :
    SubDir is a string variable holding the name of the subdirectory.
Sign In or Register to comment.