I've had luck naming the custom action property to the same name as the custom
action which needs the data. For example:
<CustomAction Id="CA_FileList" Property="CA_Relocate"
Value="MSI;[INSTALLDIR];[#F_txt_Mzc3MjQyNTQ1OA]"
Return="check" />
<CustomAction Id="CA_Relocate" BinaryKey="B_ClearFolder"
DllEntry="Relocate" Return="check" Execute="deferred" />
Also, I found that if you have your Value field formatted in such a way
(KEY=VALUE;KEY=VALUE;...), your session's CustomActionData property formats it
properly in the dictionary.
Dariel
-----Original Message-----
From: Curtis Jewell [mailto:[email protected]]
Sent: Friday, April 16, 2010 7:30 PM
To: discussion for Windows Installer XML toolset.
Subject: [WiX-users] Can't get my custom action to read the CustomActionData
property.
It's a deferred-execution DLL custom action that I'm writing. Is it that I'm
doing it too early, too late, the wrong thing, what? (It has to be after
InstallFiles because it modifies 40 of the 8000 files that were just installed
to refer to the location that the files were installed to, instead of the
location that they were built in.)
Here's how the custom action is defined in my main file:
<CustomAction Id="CA_FileList" Property="CustomActionData"
Value="MSI;[INSTALLDIR];[#F_txt_Mzc3MjQyNTQ1OA]"
Return="check" />
<CustomAction Id="CA_Relocate" BinaryKey="B_ClearFolder"
DllEntry="Relocate" Return="check" Execute="deferred" />
....
<InstallExecuteSequence>
<!-- Other custom actions here. -->
<Custom Action="CA_FileList"
After="InstallFiles"/>
<Custom Action="CA_Relocate"
After="CA_FileList">
<![CDATA[NOT (NO_RELOCATE OR
Installed)]]>
</Custom>
</InstallExecuteSequence>
...
And here's the source code.
UINT __stdcall Relocate(
MSIHANDLE hModule) // Handle of MSI being installed. [in]
// Passed to most other routines.
{
TCHAR sInstallDirectory[MAX_PATH + 1];
TCHAR sRelocationFile[MAX_PATH + 1];
TCHAR sCAData[MAX_PATH * 2 + 7];
UINT uiAnswer;
DWORD dwPropLength;
// Get directory to relocate to.
dwPropLength = MAX_PATH * 2 + 6;
uiAnswer = ::MsiGetProperty(hModule, TEXT("CustomActionData"),
sCAData, &dwPropLength);
if (ERROR_SUCCESS != uiAnswer) {
return uiAnswer;
}
// *** At this point, uiAnswer = ERROR_SUCCESS, dwPropLength is 0, and sCAData
is an empty string, *** // *** so the first tokenize call is failing my check
and returning ERROR_INSTALL_FAILURE. *** // *** Am I doing something wrong
here? ***
TCHAR *sTokenContext = NULL;
TCHAR *sToken = NULL;
sToken = _tcstok_s(sCAData, _T(";"), &sTokenContext);
if (0 != _tcscmp(sToken, _T("MSI"))) {
return ERROR_INSTALL_FAILURE;
}
sToken = _tcstok_s(NULL, _T(";"), &sTokenContext);
_tcscpy_s(sInstallDirectory, _MAX_PATH, sToken);
sToken = _tcstok_s(NULL, _T(";"), &sTokenContext);
_tcscpy_s(sRelocationFile, _MAX_PATH, sToken);
return Relocate_Worker(hModule, sInstallDirectory,
sRelocationFile); // which will return ERROR_SUCCESS or
ERROR_INSTALL_FAILURE as appropriate.
}
And the applicable log entries from a /l:*vx log (the long gap was because I
was doing some other stuff waiting for the debug stuff to pop
up):
#line 16957
Action ended 18:49:01: InstallFiles. Return value 1.
MSI (s) (08:34) [18:49:01:829]: Doing action: CA_FileList Action 18:49:01:
CA_FileList.
Action start 18:49:01: CA_FileList.
MSI (s) (08:34) [18:49:01:829]: PROPERTY CHANGE: Adding CustomActionData
property. Its value is 'MSI;C:\vanilla2\;C:\vanilla2\strawberry-ui.reloc.txt'.
Action ended 18:49:01: CA_FileList. Return value 1.
MSI (s) (08:34) [18:49:01:829]: Doing action: CA_Relocate Action 18:49:01:
CA_Relocate. Relocating Strawberry Perl...
Action start 18:49:01: CA_Relocate.
1: Relocating Strawberry Perl...
Action ended 18:49:01: CA_Relocate. Return value 1.
#line 70989
MSI (s) (08:34) [18:51:39:847]: Executing op:
ActionStart(Name=CA_Relocate,Description=Relocating Strawberry Perl...,) Action
18:51:39: CA_Relocate. Relocating Strawberry Perl...
MSI (s) (08:34) [18:51:39:857]: Executing op:
CustomActionSchedule(Action=CA_Relocate,ActionType=66561,Source=BinaryData,Target=Relocate,)
MSI (s) (08:34) [18:51:39:857]: Creating MSIHANDLE (2) of type 790536 for
thread 2356 MSI (s) (08:D8) [18:51:39:857]: Invoking remote custom action. DLL:
C:\WINDOWS\Installer\MSI495.tmp, Entrypoint: Relocate MSI (s) (08:E0)
[18:51:39:867]: Generating random cookie.
MSI (s) (08:E0) [18:51:39:877]: Created Custom Action Server with PID
2136 (0x858).
MSI (s) (08:40) [18:51:39:917]: Running as a service.
MSI (s) (08:40) [18:51:39:917]: Hello, I'm your 32bit Impersonated custom
action server.
MSI (s) (08:D8) [19:06:01:285]: Closing MSIHANDLE (2) of type 790536 for thread
2356 Action ended 19:06:01: InstallFinalize. Return value 3.
Hope this helps.
--Curtis Jewell
--
Curtis Jewell
[email protected]<mailto:[email protected]>
%DCL-E-MEM-BAD, bad memory
-VMS-F-PDGERS, pudding between the ears
[I use PC-Alpine, which deliberately does not display colors and pictures in
HTML mail]
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval Try the new software tools for
yourself. Speed compiling, find bugs proactively, and fine-tune applications
for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
WiX-users mailing list
[email protected]<mailto:[email protected]>
https://lists.sourceforge.net/lists/listinfo/wix-users
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
WiX-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wix-users