I am try to use Checkbox with this sample from WIX
nothing happened when I try to use the Checkbox
Regards
<Binary Id="StringTransfer" SourceFile="$(var.SolutionDir)CustomAction2\bin\Release\CustomAction2.CA.dll" />
<CustomAction
Id="INSTALLSETTINGS"
BinaryKey="StringTransfer"
DllEntry="CustomAction1"
Execute="deferred"
Impersonate="no"
Return="check"
/>
<InstallExecuteSequence>
<Custom Action="INSTALLSETTINGS" After="InstallInitialize">
CHECKBOXINSTALLSETTINGS=1
</Custom>
</InstallExecuteSequence>
<Control Id="test" Type="CheckBox" Width="125" Height="26" X="26" Y="124" Text="My text" Property="CHECKBOXINSTALLSETTINGS" CheckBoxValue="1" />
<Property Id="CHECKBOXINSTALLSETTINGS" Value="1"/>
<CustomAction()>
Public Shared Function CustomAction1(ByVal session As Session) As ActionResult
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings\Test", "mintext", "0")
session.Log("Begin CustomAction1")
Return ActionResult.Success
End Function
Related
I'm trying to open different URLs based when app is installed and uninstalled. Currently this setup opens both URLs when uninstalling but nothing when installing.
<Property Id="InstallURL">$(var.HomepageURL)install?ver=$(var.VersionNumber)</Property>
<Property Id="UninstallURL">$(var.HomepageURL)uninstall?ver=$(var.VersionNumber)</Property>
<CustomAction Id="SetOpenInstallURL" Property="WixShellExecTarget" Value="[InstallURL]" />
<CustomAction Id="SetOpenUninstallURL" Property="WixShellExecTarget" Value="[UninstallURL]" />
<CustomAction Id="OpenInstallURL" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" Return="ignore" />
<CustomAction Id="OpenUninstallURL" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" Return="ignore" />
<InstallExecuteSequence>
<!-- Launch webpage during install -->
<Custom Action='SetOpenInstallURL' After='InstallFinalize'><![CDATA[Installed]]></Custom>
<Custom Action="OpenInstallURL" After="SetOpenInstallURL"></Custom>
</InstallExecuteSequence>
<InstallExecuteSequence>
<!-- Launch webpage during full uninstall, but not upgrade -->
<Custom Action="SetOpenUninstallURL" After="InstallFinalize"><![CDATA[REMOVE ~= "ALL" AND NOT UPGRADINGPRODUCTCODE]]></Custom>
<Custom Action="OpenUninstallURL" After="SetOpenUninstallURL"></Custom>
</InstallExecuteSequence>
Another attempt after examining msi log at https://gist.github.com/raspi/7072ecdb43d929901e3d228893cfa124
<Property Id="InstallURL">$(var.HomepageURL)install?ver=$(var.VersionNumber)</Property>
<Property Id="UninstallURL">$(var.HomepageURL)uninstall?ver=$(var.VersionNumber)</Property>
<!-- Set value of WixShellExecTarget property to value of InstallURL if this is first time install -->
<SetProperty Id="WixShellExecTarget" Action="SetInstallURL" Value="[InstallURL]" Before="OpenURL" Sequence="execute">NOT Installed</SetProperty>
<!-- Set value of WixShellExecTarget property to value of UninstallURL if this is uninstall -->
<SetProperty Id="WixShellExecTarget" Action="SetUninstallURL" Value="[UninstallURL]" Before="OpenURL" Sequence="execute">REMOVE</SetProperty>
<CustomAction Id="OpenURL" BinaryKey="WixCA" DllEntry="WixShellExec" Return="ignore" />
<InstallExecuteSequence>
<Custom Action="OpenURL" After="InstallFinalize"/>
</InstallExecuteSequence>
I have following Fragment to define my CustomActions (actually 2 methods in my CA-project)
<Fragment>
<Binary Id="FooAssembly"
SourceFile="Foo.CA.dll" />
<CustomAction Id="Action1"
BinaryKey="FooAssembly"
DllEntry="Action1" />
<CustomAction Id="Action2"
BinaryKey="FooAssembly"
DllEntry="Action2" />
</Fragment>
My Action1 looks like this:
[Microsoft.Deployment.WindowsInstaller.CustomAction]
public static ActionResult Action1(Microsoft.Deployment.WindowsInstaller.Session session)
{
session["value1"] = "some value";
session["value2"] = "some value";
return ActionResult.Success;
}
Now I need to run this CustomAction when my dialog is showing and bind the value value1 to a Edit-control like so:
<Dialog Id="FooDlg">
<Control Id="FooEdit"
Type="Edit"
Text="[value1]"
Property="value1"
Disabled="yes" />
</Dialog>
My InstallUISequence looks like this
<InstallUISequence>
<Show Dialog="FooDlg"
After="CostFinalize" />
</InstallUISequence>
I am using an Edit-control here, because I need some border - which Text is missing - and therefore I need to have the attribute Property filled.
How can I achieve this?
I have solved this by adapting my InstallUISequence like
<InstallUISequence>
<Custom Action="Action1"
After="CostFinalize" />
<Show Dialog="FooDlg"
After="Action1" />
</InstallUISequence>
I use following configuration to start my server after installation of application:
<InstallExecuteSequence>
<Custom Action='LaunchApplication' After='InstallFinalize'/>
</InstallExecuteSequence>
<Property Id="WixShellExecTarget" Value="[#startServer.vbs]" />
<CustomAction Id="LaunchApplication"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Execute="immediate"
Impersonate="yes" />
Installer executes script startServer.vbs at the end of installation procedure.
What property Id should I use if I need to execute several custom actions?
For example if I will use following configuration. What property Id should I use for StopApplication custom action?
<InstallExecuteSequence>
<Custom Action='LaunchApplication' After='InstallFinalize'/>
<Custom Action='StopApplication' Before='InstallValidate'/>
</InstallExecuteSequence>
<Property Id="WixShellExecTarget" Value="[#startServer.vbs]" />
<CustomAction Id="LaunchApplication"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Execute="immediate"
Impersonate="yes" />
<Property Id="???" Value="[#stopServer.vbs]" />
<CustomAction Id="StopApplication"
BinaryKey="WixCA"
DllEntry="WixShellExec"
Execute="immediate"
Impersonate="yes" />
UPDATE:
There is error "There is a problem with this Windows Installer package. A script required for this install to complete could not be run." during installation if I use following configuration:
<InstallExecuteSequence>
<Custom Action='StartServerCustomAction' After='InstallFinalize'/>
</InstallExecuteSequence>
<Binary Id='StartServerScript' SourceFile='startServer.vbs' />
<CustomAction Id='StartServerCustomAction' BinaryKey='StartServerScript' JScriptCall='startServerSub' Return='check' />
startServer.vbs
Public Function startServerSub()
Return 0
End Function
I have several properties to set when ALLUSERS is 1:
<CustomAction Id="CA1" Property="InstallDir" Value="[MYINSTALLDIR]" Execute="immediate" />
<CustomAction Id="CA2" Property="Version" Value="2.0" Execute="immediate" />
<CustomAction Id="CA3" Property="x" Value="x" Execute="immediate" />
<CustomAction Id="CA4" ... />
<CustomAction Id="CA5" ... />
<InstallExecuteSequence>
<Custom Action="CA1" After="AppSearch">ALLUSERS=1</Custom>
<Custom Action="CA2" After="AppSearch">ALLUSERS=1</Custom>
<Custom Action="CA3" After="AppSearch">ALLUSERS=1</Custom>
<Custom Action="CA4" After="AppSearch">ALLUSERS=1</Custom>
<Custom Action="CA5" After="AppSearch">ALLUSERS=1</Custom>
</InstallExecuteSequence>
This is working but I'm wondering if there is more concise way instead of tons of CAs and stupid IDs, something like:
<CustomAction Id="CA" Property="InstallDir=[MYINSTALLDIR]; Version=2.0; x=x; y=y; z=z ..." Execute="immediate" />
<InstallExecuteSequence>
<Custom Action="CA" After="AppSearch">ALLUSERS=1</Custom>
</InstallExecuteSequence>
Is this possible?
You could write a C++ custom action that calls MsiSetProperty() a bunch of times. There will technically be more risk for failure though. Once setup, a bunch of set property CA's is usually not that horrible.
I have a WiX file that includes this snippet:
<CustomAction Id="DownloadCache" FileKey="CACHEDOWNLOADER.EXE" ExeCommand="/v" Execute="deferred" Return="ignore"/>
<UI>
<Dialog Id="ExitDialog" Title="Product Installer" Height="60" Width="250">
...
</Dialog>
<Dialog Id="FatalErrorDialog" Title="Product Installer" Height="60" Width="250">
...
</Dialog>
<TextStyle Id="DefaultFont" FaceName="Arial" Size="10" />
<Property Id="DefaultUIFont" Value="DefaultFont" />
<InstallUISequence>
<Custom Action="DownloadCache" After="ExecuteAction">(NOT Installed) AND (Not REMOVE)</Custom>
<Show Dialog="ExitDialog" OnExit="success" />
<Show Dialog="FatalErrorDialog" OnExit="error" />
</InstallUISequence>
</UI>
<InstallExecuteSequence>
<Custom Action="DownloadCache" After="WriteRegistryValues">(NOT Installed) AND (Not REMOVE)</Custom>
</InstallExecuteSequence>
The issue is, the resulting .MSI does NOT contain an InstallUISequence table.
I went through the tutorial Events and Actions and the above seems correct. I'm definitely missing something here. How can I fix it?
There must be more than meets the eye here. Even the simplest fragment below will generate an InstallUISequence table with the bare minimum actions of ValidateProductID, CostInitialize, FileCost, CostFinalize and ExecuteAction. No actual UI elements per se, but that's another issue.... (Are Dialogs Optional Now??)
<Wix...>
<Product...>
<Package.../>
</Product>
</Wix>