wix — C ++ Custom Action возвращает пустую строку

У нас проблема с отложенным настраиваемым действием в c ++. Мы просто хотим получить значение для свойства customactiondata ‘apacheconfpath’, которое в настоящий момент имеет фиктивное значение test.

Вот наше пользовательское действие c ++:

 UINT __stdcall AppendToApacheConfigFile(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
TCHAR sWord[100];

hr = WcaInitialize(hInstall, "AppendToApacheConfigFile");
ExitOnFailure(hr, "Failed to initialize");

TCHAR szActionData[MAX_PATH] = {0};
DWORD dActionDataLen = MAX_PATH;
MsiGetProperty (hInstall, TEXT("apacheconfpath"), TEXT(""), &dActionDataLen);

StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen);
WcaLog(LOGMSG_STANDARD, "dActionDataLen = %s", sWord);

if (dActionDataLen > 0)
{
++dActionDataLen;
StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen);
WcaLog(LOGMSG_STANDARD, "dActionDataLen(2) = %s", sWord);
MsiGetProperty (hInstall, TEXT("apacheconfpath"), szActionData, &dActionDataLen);
WcaLog(LOGMSG_STANDARD, "szActionData = %s", szActionData);
StringCbPrintf(sWord, 100, TEXT("%d"), dActionDataLen);
WcaLog(LOGMSG_STANDARD, "dActionDataLen(3) = %s", sWord);

//Do something with the value
}

LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

Свойство устанавливается здесь в нашем установщике wix:

<CustomAction Id="AppendToApacheConfigFile_Cmd" Property="AppendToApacheConfigFile" Value="/apacheconfpath=test;" />
<CustomAction Id="AppendToApacheConfigFile" BinaryKey="CustomActionDll" DllEntry="AppendToApacheConfigFile" Execute="deferred" />

<InstallExecuteSequence>
<Custom Action="AppendToApacheConfigFile_Cmd" Before="AppendToApacheConfigFile"><![CDATA[IIS_SELECTED <> 1]]></Custom>
<Custom Action="AppendToApacheConfigFile" After="DeployPhpRuntime"><![CDATA[IIS_SELECTED <> 1]]></Custom>
</InstallExecuteSequence>

Я добавил много журналов, чтобы попытаться увидеть, что происходит. Может показаться, что свойство никогда не читается, поскольку значение dword всегда равно 0, а данные всегда пусты. Мы никогда не пройдем первое чтение.

Согласно журналу значение было установлено

MSI (s) (80:C4) [20:59:30:210]: Executing op: CustomActionSchedule(Action=AppendToApacheConfigFile,ActionType=1025,Source=BinaryData,Target=AppendToApacheConfigFile,CustomActionData=/apacheconfpath=test;)

Любая информация будет приветствоваться

1

Решение

Когда отложенное пользовательское действие запрашивает данные, оно запрашивает их через известный идентификатор CustomActionData, Вы можете увидеть это имя в файле журнала в конце этой строки:

MSI (s) (80:C4) [20:59:30:210]: Executing op: CustomActionSchedule(Action=AppendToApacheConfigFile,ActionType=1025,Source=BinaryData,Target=AppendToApacheConfigFile,CustomActionData=/apacheconfpath=test;)

Чтобы получить доступ к данным, вы должны изменить MsiGetProperty позвоните, чтобы выглядеть больше как:

MsiGetProperty(hInstall, TEXT("CustomActionData"), TEXT(""), &dActionDataLen);

Примечание. Поскольку вы уже используете wcautil, я настоятельно рекомендую использовать WcaGetProperty() вместо MsiGetProperty(), Вы хотите проверить код возврата от WcaGetProperty() и при этом ваше пользовательское действие будет правильно обрабатывать отмены пользователя. В противном случае ваше пользовательское действие может поглотить попытку пользователя отменить установку.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]