Tweek.MM |
This shows the manipulation of an existing MSI file (and creation of a transform) rather than the creation of new MSI files.
;---------------------------------------------------------------------------- ; ; MODULE NAME: TWEEK.MM ; ; $Author: USER "Dennis" $ ; $Revision: 1.11 $ ; $Date: 23 Aug 2008 14:20:04 $ ; $Logfile: C:/DBAREIS/Projects.PVCS/Win32/MakeMsi/Tweek.mm.pvcs $ ; COPYRIGHT: (C)opyright Dennis Bareis, Australia, 2003 ; All rights reserved. ; ; DESCRIPTION ; ~~~~~~~~~~~ ; This sample demonstrates how to make small changes to existing MSI ; files although it also demonstrates a number of other PPWIZARD and ; MAKEMSI things. ; ; The "main" code (and all that is required) is the following: ; ; #include "OpenMsi.MMH" ; <$Msi "out\Tweek.mm\Msi\After.msi" template="out\Tweek.mm\Msi\Before.msi"> ; <$Property "ABCDEFG" VALUE="C:\"> ; <$Table "RadioButton"> ; <$RowsDelete WHERE="Property = 'IAgree' AND `Order` = '2'"> ; <$/Table> ; <$/Msi> ;---------------------------------------------------------------------------- ;--- Define where files are ------------------------------------------------- #define MsiBEFORE_SRC ..\Create MSI Installers\out\TryMe.MM\MSI\TryMe.MSI #define MsiDestDir out\Tweek.mm\Msi #define MsiBEFORE <$MsiDestDir>\Before.msi #define MsiAFTER <$MsiDestDir>\After.msi #define MstFile <$MsiDestDir>\ConvertBefore2After.mst #define TxtDifference <$MsiDestDir>\Changes.txt ;--- Prepare for my sample below -------------------------------------------- #DefineRexx '' ;--- Make sure the "source File" exists --- if FileQueryExists('<$MsiBEFORE_SRC>') = '' then error('The file "<$MsiBEFORE_SRC>" does not exist!',,'You should first create it by building "TRYME.MM"!'); ;--- Clean up and prepare a "before" MSI --------------------------------- call FileDelete '<$MsiBEFORE>', 'N'; call FileDelete '<$MsiAFTER>', 'N'; call MakeDirectoryTree '<$MsiDestDir>'; call FileCopy '<$MsiBEFORE_SRC>', '<$MsiBEFORE>'; #DefineRexx ;--- Include the correct support (MAKEMSI.MMH/DEPT.MMH for MSI Creation) ---- #define COMPILE_CAB_FILE_NAME TW* ;;Good idea to alter if you wish to possibly add files to an original MAKEMSI generated MSI (if its your own - why) #define DBG_ALL Y ;;Good unless you think it impacts performance #include "OpenMsi.MMH" ;--- The actual sample! ----------------------------------------------------- <$Msi "<$MsiAFTER>" template="<$MsiBEFORE>"> ;--- Add a property ------------------------------------------------------ <$Property "ABCDEFG" VALUE="C:\"> ;--- Modify text of one row of the "RadioButton" table ------------------- <$Table "RadioButton"> #( <$Row @where="Property = 'IAgree' AND `Order` = 2" @SelfRef=^{*}^ *Text=^replace(<$ColStr.RadioButton.Text>, "Licence", "LICENSE")^ > #) <$/Table> ;--- This part turned off by default ------------------------------------- #ifdef ADD_FILES ;--- Use orca to work out existing Feature (or create new) ----------- <$Feature "ALL.3.076.0000.TryMe_simple_MAKEMSI_te"> ;;MAKEMSI by default creates cryptic feature root feature names (good in logs but...), you could rename... ;--- Create a new component ------------------------------------- <$Component "ExtraFilesAddedDuringUpdateOfExistingMSI" Directory_="INSTALLDIR"> ;;Obviously I know "INSTALLDIR" already exists also... ;--- Add two files ------------------------------------------ <$Files "Tweek.mm" KeyFile="*"> <$Files "ReadMe.txt"> <$/Component> <$/Feature> #endif ;--- Create a transform (can be applied to the "before" msi) ------------- <$Transform "<$MstFile>"> <$/Msi> ;--- Display the changes we made above ("schedule" it after validation) ----- #( #define+ ONEXIT_AFTER_MSI_BUILT_AND_VALIDATED #DefineRexx '' ;--- Is MSIDIFF.VBS installed? --------------------------------------- call Info "MSI UPDATE COMPLETE (will now now compare if possible)"; if GetEnv("MSIDIFF_DIR") = '' then; call Info "*** MSIDIFF is not installed (so I can't compare the two databases)..."; else; do; ;--- Make the difference file (assume in current dir or PATH) ------------ call Info "Executing MSIDIFF.VBS to dump the changes to the MSI..."; call Say ""; DiffRc = AddressCmd('cscript.exe //nologo "' || GetEnv("MSIDIFF_DIR", "Y") || 'msidiff.vbs" "<$MsiBEFORE>" "<$MsiAFTER>" >"<$TxtDifference>"'); TypeRc = AddressCmd('type "<$TxtDifference>"'); end; #DefineRexx #)