[wix-users] Pass variables from one custom action to another

harald goci harald.goci at panagenda.com
Fri Aug 3 07:40:09 PDT 2018


Immediate Custom Actions can access any property and even create new ones.

BR,
Harald Goci
Senior Software Engineer

Email: harald.goci at panagenda.com - Web: www.panagenda.com
Phone: +43 1 890 12 89-44 - Fax: +43 1 890 12 89-15

(Embedded image moved to file: pic14309.jpg)

panagenda GmbH - Schreyvogelgasse 3/10 - 1010 Vienna - Austria
Registered Office: Vienna - HG Wien - FN 293516t - VAT-ID: ATU63362738
Executive Directors: Florian Vogler (CEO & CTO), Felix Vogler (CFO & COO)

(Embedded image moved to file: pic07616.jpg)

The information in this E-Mail is confidential and privileged. It is
intended solely for the addressee. Access to this E-Mail by anyone else is
unauthorized. If you are not the intended recipient, any disclosure,
copying, distribution or any action taken in reliance on it is prohibited
and will be unlawful. If you receive this message in error, please notify
the sender immediately and delete all copies of this message.




From:	Elena Aralla <elena.aralla at gmail.com>
To:	WiX Toolset Users Mailing List <wix-users at lists.wixtoolset.org>
Cc:	harald goci <harald.goci at panagenda.com>
Date:	03.08.2018 16:32
Subject:	Re: [wix-users] Pass variables from one custom action to
            another



Hi,
thank you for your replay.

This limit is also in Immediate Custom Action, which can read property on
session, but can’t modify them and cannot return data to WIX (except for
ActionResult)

So the only solution for me, will be to write data to registry or some ini
file, so other Custom Actions can read them.

Could you confirm these statements?
Have a nice day,
Elena.



> Il giorno 03 ago 2018, alle ore 13:19, harald goci via wix-users
<wix-users at lists.wixtoolset.org> ha scritto:
>
> Hi!
> Deferred Custom Actions cannot return data because of a limitation in
> Installer SDK.
> It seems that WiX creators tried to create a work around which is
available
> for C++ only.
> See the posting of Bob Arnson in
>
https://stackoverflow.com/questions/27594036/pass-data-between-deferred-custom-action#

>
> BR,
> Harald Goci
> Senior Software Engineer
>
> Email: harald.goci at panagenda.com - Web: www.panagenda.com
> Phone: +43 1 890 12 89-44 - Fax: +43 1 890 12 89-15
>
> (Embedded image moved to file: pic14311.jpg)
>
> panagenda GmbH - Schreyvogelgasse 3/10 - 1010 Vienna - Austria
> Registered Office: Vienna - HG Wien - FN 293516t - VAT-ID: ATU63362738
> Executive Directors: Florian Vogler (CEO & CTO), Felix Vogler (CFO & COO)
>
> (Embedded image moved to file: pic25709.jpg)
>
> The information in this E-Mail is confidential and privileged. It is
> intended solely for the addressee. Access to this E-Mail by anyone else
is
> unauthorized. If you are not the intended recipient, any disclosure,
> copying, distribution or any action taken in reliance on it is prohibited
> and will be unlawful. If you receive this message in error, please notify
> the sender immediately and delete all copies of this message.
>
>
>
>
> From:		 Elena Aralla via wix-users
<wix-users at lists.wixtoolset.org>
> To:		 WiX Toolset Users Mailing List
<wix-users at lists.wixtoolset.org>
> Cc:		 Elena Aralla <elena.aralla at gmail.com>
> Date:		 03.08.2018 12:25
> Subject:		 Re: [wix-users] Pass variables from one custom action to
>            another
> Sent by:		 "wix-users" <wix-users-bounces at lists.wixtoolset.org>
>
>
>
> Hi,
>
> I tried without success!
>
> I can pass  data of CustomAction1 to CustomAction2 -> OK; I can change
the
> value of session.CustomActionData["SomeCustomActionDataKey”]  from 1 to
2!
> (see log at the end of this email)
>
> How can I pass SomeCustomActionDataKey, defined in CustomAction1 and
> changed in CustomAction2 to CustomAction3 or CustomAction4 too?
>
> This is my code:
>
> Product.wxs:
> =======================================
>
>    <Property Id="MyVar" Value="1" />
>
>    <CustomAction Id="CustomAction1"
>                  Property="CustomAction2"
>                  Value="SomeCustomActionDataKey=[MyVar]"/>
>
>    <Binary Id="CustomActionABin" SourceFile="$
> (var.CustomActionA.TargetDir)$(var.CustomActionA.TargetName).CA.dll" />
>    <CustomAction Id="CustomAction2"
>                  BinaryKey="CustomActionABin"
>                  DllEntry="CustomAction1"
>                  Execute="deferred"
>                  Return="check"
>                  HideTarget="no" />
>
>
>    <CustomAction Id="CustomAction3"
>                  Property="CustomAction4"
>                  Value="SomeCustomActionDataKey=WHAT VALUE THERE??"/>
>
>    <!-- custom action - riferimento alla dll -->
>    <Binary Id="CustomActionBBin" SourceFile="$
> (var.CustomActionB.TargetDir)$(var.CustomActionB.TargetName).CA.dll" />
>    <CustomAction Id="CustomAction4"
>                  BinaryKey="CustomActionBBin"
>                  DllEntry="CustomAction1"
>                  Execute="deferred"
>                  Return="check"
>                  HideTarget="no" />
>
>
>
>    <InstallExecuteSequence>
>      <Custom Action="CustomAction1" Before="CustomAction2" />
>      <Custom Action="CustomAction2" Before="CustomAction3" />
>      <Custom Action="CustomAction3" Before="CustomAction4" />
>      <Custom Action="CustomAction4" After="InstallInitialize" />
>    </InstallExecuteSequence>
>
>
>
> CustomActionA
> =======================================
>
> using System;
> using System.Collections.Generic;
> using System.Text;
> using Microsoft.Deployment.WindowsInstaller;
>
> namespace CustomActionA
> {
>    public class CustomActions
>    {
>        [CustomAction]
>        public static ActionResult CustomAction1(Session session)
>        {
>            session.Log("Begin CustomAction1");
>
>            session.Log("session.CustomActionData
[\"SomeCustomActionDataKey
> \"]={0}", session.CustomActionData["SomeCustomActionDataKey"]);
>
>            session.CustomActionData["SomeCustomActionDataKey"] = "2";
>
>            session.Log("session.CustomActionData
[\"SomeCustomActionDataKey
> \"]={0}", session.CustomActionData["SomeCustomActionDataKey"]);
>
>            return ActionResult.Success;
>        }
>    }
> }
>
>
> CustomActionB
> =======================================
>
> using System;
> using System.Collections.Generic;
> using System.Text;
> using Microsoft.Deployment.WindowsInstaller;
>
> namespace CustomActionB
> {
>    public class CustomActions
>    {
>        [CustomAction]
>        public static ActionResult CustomAction1(Session session)
>        {
>            session.Log("Begin CustomAction1");
>
> 		 		      // this should have value=2!!
>            session.Log("session.CustomActionData
[\"SomeCustomActionDataKey
> \"]={0}", session.CustomActionData["SomeCustomActionDataKey"]);
>
>            session.CustomActionData["SomeCustomActionDataKey"] = "3";
>
>            session.Log("session.CustomActionData
[\"SomeCustomActionDataKey
> \"]={0}", session.CustomActionData["SomeCustomActionDataKey"]);
>
>            return ActionResult.Success;
>        }
>    }
> }
>
>
> LOG:
>
>
> Begin CustomAction1A
> MSI (s) (CC!88) [11:55:49:619]: Closing MSIHANDLE (162) of type 790531
for
> thread 17800
> MSI (s) (CC!88) [11:55:49:623]: Creating MSIHANDLE (163) of type 790531
for
> thread 17800
> session.CustomActionData=1
> MSI (s) (CC!88) [11:55:49:624]: Closing MSIHANDLE (163) of type 790531
for
> thread 17800
> MSI (s) (CC!88) [11:55:49:627]: Creating MSIHANDLE (164) of type 790531
for
> thread 17800
> session.CustomActionData=2
> MSI (s) (CC!88) [11:55:49:628]: Closing MSIHANDLE (164) of type 790531
for
> thread 17800
> MSI (s) (CC:04) [11:55:49:641]: Closing MSIHANDLE (158) of type 790536
for
> thread 8404
> MSI (s) (CC:D4) [11:55:49:643]: Executing op: ActionStart
> (Name=CustomAction4,,)
> MSI (s) (CC:D4) [11:55:49:645]: Executing op: CustomActionSchedule
>
(Action=CustomAction4,ActionType=1025,Source=BinaryData,Target=CustomAction1,CustomActionData=SomeCustomActionDataKey=)

>
> MSI (s) (CC:D4) [11:55:49:647]: Creating MSIHANDLE (165) of type 790536
for
> thread 8404
> MSI (s) (CC:EC) [11:55:49:649]: Invoking remote custom action. DLL:
> C:\WINDOWS\Installer\MSIF093.tmp, Entrypoint: CustomAction1
> MSI (s) (CC!B4) [11:55:49:718]: Creating MSIHANDLE (166) of type 790531
for
> thread 21428
> SFXCA: Extracting custom action to temporary directory: C:\Users\BugFree
> \AppData\Local\Temp\MSIF093.tmp-\
> MSI (s) (CC!B4) [11:55:49:722]: Closing MSIHANDLE (166) of type 790531
for
> thread 21428
> MSI (s) (CC!B4) [11:55:49:772]: Creating MSIHANDLE (167) of type 790531
for
> thread 21428
> SFXCA: Binding to CLR version v4.0.30319
> MSI (s) (CC!B4) [11:55:49:775]: Closing MSIHANDLE (167) of type 790531
for
> thread 21428
> MSI (s) (CC!B4) [11:55:49:814]: Creating MSIHANDLE (168) of type 790531
for
> thread 21428
> Calling custom action
> CustomActionB!CustomActionB.CustomActions.CustomAction1
> MSI (s) (CC!B4) [11:55:49:823]: Closing MSIHANDLE (168) of type 790531
for
> thread 21428
> MSI (s) (CC!B4) [11:55:49:829]: Creating MSIHANDLE (169) of type 790531
for
> thread 21428
> Begin CustomAction1B
> MSI (s) (CC!B4) [11:55:49:832]: Closing MSIHANDLE (169) of type 790531
for
> thread 21428
> MSI (s) (CC!B4) [11:55:49:837]: Creating MSIHANDLE (170) of type 790531
for
> thread 21428
> session.CustomActionData=
> MSI (s) (CC!B4) [11:55:49:838]: Closing MSIHANDLE (170) of type 790531
for
> thread 21428
> MSI (s) (CC!B4) [11:55:49:841]: Creating MSIHANDLE (171) of type 790531
for
> thread 21428
> session.CustomActionData=3
>
>
>
>
>
>
>
>
>
>> Il giorno 02 ago 2018, alle ore 12:01, Fyodor Koryazhkin via wix-users
> <wix-users at lists.wixtoolset.org> ha scritto:
>>
>> Hi,
>> The best way to pass data from one CA to another is to use properties.
If
>> your CA that consumes properties is deferred then all properties can be
>> passed as a string in one property that has ID as your deferred action;
> and
>> in your deferred action you retrieve that string reading
CustomActionData
>> property. If your properties hold sensitive data you mark them as hidden
>> and you add attribute
>> msidbCustomActionTypeHideTargetto your CA
>>
>> On Thu, Aug 2, 2018 at 12:48 PM Elena Aralla via wix-users <
>> wix-users at lists.wixtoolset.org> wrote:
>>
>>>
>>> Hi,
>>>
>>> I’m using the registry to exchange data between custom actions.
>>>
>>> For example, I have a custom action that determines the directory where
> to
>>> install the program depending on my business rules.
>>>
>>> this CA writes the resulting value in the registry  the custom action
> that
>>> installs the database (I’m using SQLCE) reads from the registry the
>>> directory and uses it to decide where to save the db.
>>>
>>> It works!
>>>
>>> Is there any drawback or a better way to do this?
>>>
>>> Thank you,
>>> Elena.
>>>
>>> ____________________________________________________________________
>>> WiX Toolset Users Mailing List provided by FireGiant
>>> http://www.firegiant.com/
>>
>>
>>
>> --
>> Regards,
>> Fyodor Koryazhkin..
>>
>> ____________________________________________________________________
>> WiX Toolset Users Mailing List provided by FireGiant
> http://www.firegiant.com/
>
>
> ____________________________________________________________________
> WiX Toolset Users Mailing List provided by FireGiant
> http://www.firegiant.com/
>
> ____________________________________________________________________
> WiX Toolset Users Mailing List provided by FireGiant
http://www.firegiant.com/




More information about the wix-users mailing list