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

harald goci harald.goci at panagenda.com
Fri Aug 3 04:19:23 PDT 2018


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/


More information about the wix-users mailing list