MAKEMSI quickly and reliably creates MSI files in a non-programmatic way
Have your say! Join the MAKEMSI discussion list or view archive! Suggest improvements. No question too simple or too complex.
[Bottom][Contents][Prev]: TryMeWithUserDialog.MM[Next]: TryMeWithNoRootFeature.MM
Have your say! Join the MAKEMSI discussion list or view archive! Suggest improvements. No question too simple or too complex.
\->MAKEMSI Installs...->Samples Installed by MAKEMSI->Samples - Build New MSI/MSM->TryMeWithNonAdvShortcutPlusMore.MM

TryMeWithNonAdvShortcutPlusMore.MM

This is one of the MAKEMSI samples which build a new MSI/MSM. This MSI makes use of these "TryMe.MM" files:

  1. TryMe.ver
  2. TryMe.rtf
;----------------------------------------------------------------------------
;    MODULE NAME:   TryMeWithNonAdvShortcutPlusMore.MM
;
;        $Author:   USER "Dennis"  $
;      $Revision:   1.13  $
;          $Date:   22 Jun 2006 19:14:24  $
;       $Logfile:   C:/DBAREIS/Projects.PVCS/Win32/MakeMsi/TryMeWithNonAdvShortcutPlusMore.MM.pvcs  $
;
; DESCRIPTION
; ~~~~~~~~~~~
; Most complicated sample in that it does a few different things.
;
; You should probably have a look at and build "TryMe.MM" before this
; one!  Since it uses the same version file it shares update codes and all
; other information (product name etc).
;
; This shows one possible way of doing things, there are many ways (some
; better) - I tried to keep the example very simple.
; Note that I would generally use an advertised shortcut where possible.
;----------------------------------------------------------------------------

;--- Override some MAKEMSI options ------------------------------------------
#define VER_FILENAME.VER  TryMe.Ver  ;;I only want one VER file for all samples!
#define DEFAULT_FILE_DATE ?          ;;Stamp all installed files with current date
#define DEFAULT_FILE_TIME ?          ;;Stamp all installed files with current time

;--- Include MAKEMSI support (with my customisations and MSI branding) ------
#include "ME.MMH"


;--- Create INSTALLDIR (remember where user wishes it installed) ------------
<$Property "INSTALLDIR" Persist="Y" PersistHow="PRODUCT FOREVER">
<$DirectoryTree Key="INSTALLDIR" Dir="c:\program files\TryMe (makemsi sample)\<$MAKEMSI_MM_BASENAME>" CHANGE="\" PrimaryFolder="Y">


;--- Add files to a single component (mainly to differ from "tryMe.MM) ------
<$Component "TryMe" Create="Y" Directory_="INSTALLDIR">
    ;--- Add the file remember its rowkey and make keypath ------------------
    <$File Source="TryMeWithNonAdvShortcutPlusMore.MM" RowKey="StartMe" KeyPath="Y">
<$/Component>


;--- Create 9 copies of this script (create required component) -------------
<$DirectoryTree Key="COPIES9DIR" Dir="[INSTALLDIR]\Copies 9">
#{ for fc = 1 to 9
    ;--- Use todays date (and midnight) on these files ----------------------
    <$File Source="TryMeWithNonAdvShortcutPlusMore.MM" Destination="[COPIES9DIR]\COPY_<??fc>.txt" REMOVE="Y" DATE="?" TIME="00:00:00">
#}



;--- Create a subfeature ----------------------------------------------------
#(
   <$Feature "SomeFeatureNotInstalledByDefault"
            Directory_="INSTALLDIR"
                 Title="Some feature"
           Description=^Optional option feature.
                        This feature will not be installed by default.^
                 Level="5"         ;;Not installed by default
   >
#)
    ;--- Create some Registry entries via a simple macro --------------------
    <$Component "RegistryCu" Create="Y" Directory_="INSTALLDIR">
        ;--- Create a simple OPTIONS macro ----------------------------------
        #(
            #define OptionInRegistry
            <$Registry HKEY="CURRENT_USER" KEY="Software\TryMe\Options"
                       Name="{$Name}" VALUE="{$Value}" KeyPath="{$KeyPath='N'}"
            >
        #)

        ;--- Set some options -----------------------------------------------
        <$OptionInRegistry Name="Option1" VALUE="Value1" KeyPath="Y">
        <$OptionInRegistry Name="Option2" VALUE="Value2">
        <$OptionInRegistry Name="Option3" VALUE="Value3">
        <$OptionInRegistry Name="Option4" VALUE="Value4">
        <$OptionInRegistry Name="Option5" VALUE="Value5">

        ;--- Set some more options ------------------------------------------
        #data Options 2
            ;--- Define information in "usage neutral" format (can use elsewhere (maybe other doco) ---
            'Option6'    'Value6'
            'Option7'    'Value7'
            'Option8'    'Value8'
            'Option9'    'Value9'
        #data
        #{  FOR @@X = 1 to <?Data:Options.?>
            ;--- Process all data in the "#data" structure ------------------
            <$OptionInRegistry Name="<?Data:Options.@@X.1>" VALUE="<?Data:Options.@@X.1>">
        #}
    <$/Component>
<$/Feature>


;--- Display a message during a non-silent install (logs if silent) ---------
#data "PopupCaData"
   ;--- Some data we'd like to pass to the CA -------------------------------
   "InstallationDirectory" "[INSTALLDIR]"
   "SystemFolder" "[SystemFolder]"
#data
<$VbsCa Binary="Popup.vbs" DATA=^PopupCaData^>
   <$VbsCaEntry "HiThere">
       ;--- If the VBSCRIPT "MsgBox" or similar function was used this would prevent a silent install ---
       #(
            CaMsgBox "I",
                     "Hi this is a message from '<?InputFile>'! This was displayed via a VBSCRIPT MSI custom action." &
                     vbCRLF & vbCRLF &
                     "Note that I have enlarged this message box so that when an error occurs you will see the whole text! " &
                     "This and most tweeking MAKEMSI does to the user interface is optional (most performed by ""UISAMPLE.MMH"")." &
                     vbCRLF & vbCRLF &
                     "The installation directory is """ & VbsCaCadGet("InstallationDirectory") & """. " &
                     "The system directory is """       & VbsCaCadGet("SystemFolder")          & """."
       #)
   <$/VbsCaEntry>
<$/VbsCa>
<$VbsCaSetup Binary="Popup.vbs" Entry="HiThere" Seq="StartServices-" CONDITION=^<$CONDITION_INSTALL_ONLY>^ DATA=^PopupCaData^>


;--- Create a JSCRIPT CA to display a popup ---------------------------------
<$JsCa Binary="Popup.js">
    <$JsCaEntry "HiThere">
        CaMsgBox( "I",
                  'This is a simple message generated by some JSCRIPT running as an MSI custom action (Now early in uninstall).'
                 );
    <$/JsCaEntry>
<$/JsCa>
<$JsCaSetup Binary="Popup.js" Entry="HiThere" Seq="InstallValidate-" CONDITION=^<$CONDITION_UNINSTALL_ONLY>^ Type="immediate">


;--- Create a VBSCRIPT (perhaps using info only known during this install), syntax check it and add to MSI ---
<$FileMake "<$MAKEMSI_VBSCRIPT_DIR>\GeneratedVbscript.vbs">
    ;--- This shows how a file can be dynamically built (accessing build info etc) ---
    <?SyntaxCheck>
    #(
        MsgBox "This vbscript was generated automatically and
                installed via <$ProdInfo.ProductName> version
                <$ProductVersion>"
                ,vbInformation
                ,"GENERATED VBSCRIPT"
    #)
<$/FileMake>
<$Files "<$MAKEMSI_VBSCRIPT_DIR>\GeneratedVbscript.vbs" DestDir="INSTALLDIR">


Microsoft awarded me an MVP (Most Valuable Professional award) in 2004, 2005, 2006, 2007, 2008 & 2009 for the Windows SDK (Windows Installer) area.Please email me any feedback, additional information or corrections.
See this page online (look for updates)

[Top][Contents][Prev]: TryMeWithUserDialog.MM[Next]: TryMeWithNoRootFeature.MM


MAKEMSI© is (C)opyright Dennis Bareis 2003-2008 (All rights reserved).
Saturday May 28 2022 at 3:11pm
Visit MAKEMSI's Home Page
Microsoft awarded me an MVP (Most Valuable Professional award) in 2004, 2005, 2006, 2007, 2008 & 2009 for the Windows SDK (Windows Installer) area.