CustomActionData |
Most property values are not available to deferred custom actions and for this reason Windows Installer defines the "CustomActionData" property as a mechanism for passing data to the task.
If you have more than one parameter to pass you will need to pick a character which will never appear in any of the parameters and combine all the parameters into a single string (using the chosen character as a delimiter). The custom action will know the character and will split up the string back into its component parameters.
As the value would normally include some MSI formatting (otherwise you would simply use a PPWIZARD "#define" to pass/code the information) you would normally use the "PropertyCa" command to set up the custom action data.
MAKEMSI includes some inbuilt support for custom action data, see the "DATA" parameter of the "VbsCaSetup" command and the "VbsCaCadGet" function.
EXAMPLE - Using inbuilt support |
MAKEMSI commands refer to the custom action data with the DATA parameter as demonstrated here:
;--- Set up the 2 parameters (CustomActionData) ----------------------------- #data "Fred" "Name1" 'Name 1 Value' ;;Parameter 1 (name + value) "Name2" "[INSTALLDIR]" ;;Parameter 2 #data ;--- Deferred Custom Action which accesses 2 passed parameters -------------- <$VbsCa Binary="TestCustomActionDataPassing.vbs" DATA="Fred"> <$VbsCaEntry "Install"> ;--- Do something ---------------------------------------------------- Show("Install: NAME1=" & VbsCaCadGet("Name1")) Show("Install: NAME2=" & VbsCaCadGet("Name2")) <$/VbsCaEntry> '======================= sub Show(Text) '======================= CaMsgBox "I", Text end sub <$/VbsCa> ;--- Set up the Deferred custom action passing the CustomActionData --------- <$VbsCaSetup Data="Fred" Binary="TestCustomActionDataPassing.vbs" Entry="Install" Seq="InstallFiles-" CONDITION=^<$CONDITION_INSTALL_ONLY>^>
EXAMPLE - Not Using inbuilt support |
This code shows how 3 parameters are passed to the simple deferred custom action.
;--- Create the custom action script ---------------------------------------- <$VbsCa Binary="Test.vbs"> ;--- Initialization (get passed arguments) ------------------------------- #define NUM_ARGS_EXPECTED 3 public args, CaData CaData = VbsCaPropertyGet("CustomActionData", "c:\tmp;2;3", "Must be 3 semi-colon separated values!") args = split(CaData, ";") if ubound(args)+1 <> <$NUM_ARGS_EXPECTED> then VbsCaRaiseError "Argument Validation", "Got " & ubound(args)+1 & " arguments, we expected <$NUM_ARGS_EXPECTED>!" end if ;--- Install code -------------------------------------------------------- <$VbsCaEntry "Install"> DisplayArgs "Install" <$/VbsCaEntry> ;--- Uninstall code ------------------------------------------------------ <$VbsCaEntry "UnInstall"> DisplayArgs "UNInstall" <$/VbsCaEntry> ;--- common user function ------------------------------------------------ sub DisplayArgs(When) CaMsgBox "I", "WHEN=" & When & vbCRLF & "1=" & args(0) & vbCRLF & "2=" & args(1) & vbCRLF & "3=" & args(2) end sub <$/VbsCa> ;--- The 3 parameters we wish to pass --------------------------------------- #( ';' ;;Use semicolon to delimit the parameters (data must not contain it!) #define TEST_ARGS [%USERNAME] ;;Try environment variable [INSTALLDIR] ;;Try "Directory" key/property [#ppwizard.rex] ;;Try full name of file as installed #) ;--- Create the property and setup the custom action ------------------------ <$PropertyCa "TEST_Install" Seq="InstallFiles-" Value="<$TEST_ARGS>"> <$VbsCaSetup Key="TEST_Install" Seq="InstallFiles-" Binary="Test.vbs" Entry="Install" CONDITION=^<$CONDITION_INSTALL_ONLY>^>