Я хочу использовать свойство установщика MSI в сообщении о состоянии в установщике WiX. Это свойство MSI устанавливается пользовательским действием C++. Я могу установить и получить одно и то же свойство и значение MSI перед вызовом сообщения условия, но оно не работает, когда я использую его в сообщении условия.

Мое сообщение о состоянии выглядит

<CustomAction Id="CustomAction1" BinaryKey="CustomDLL"
              DllEntry="CustomAction1" Execute="immediate" Return="check" />

<InstallUISequence>
 <Custom Action="CustomAction1" Before="LaunchConditions">Not Installed</Custom>
</InstallUISequence>

<InstallExecuteSequence >
 <Custom Action="CustomAction1" Before="LaunchConditions">Not Installed</Custom>
</InstallExecuteSequence>

<Condition Message="message comes here.">
 <![CDATA[(MyProperty= "NO")]]>
</Condition>

Здесь этот MyProperty является строкой и возвращает либо YES, либо NO, и он устанавливается C++ CA, и это условие не выполняется в обоих случаях. Но я хочу показать это сообщение только тогда, когда MyProperty установлен на "НЕТ".

Итак, как я могу использовать свое собственное свойство MSI в сообщении о состоянии, которое было установлено пользовательским действием?

2 ответа2

0

Я бы попытаться верхнийРЕГИСТР свойства MyProperty , чтобы сделать его публичную собственность , а затем я хотел бы также объявить его в источнике WiX через элемент свойства и установить Secure attribute Yes и посмотреть , если это помогает. Разметка WiX:

<Property Id='MYPROPERTY' Secure='yes' />

Я также извлеку свойство после того, как вы зададите его в своем пользовательском действии C++, чтобы определить, было ли оно установлено правильно (оно может быть пустым). Используя VBScript, вы можете получить свойство очень легко. Вот пример (VBScript помогает избежать какой-либо компиляции, и вы можете встроить исходный код в пользовательское действие - отлично подходит для целей тестирования - и использовать его только для целей тестирования):

MsgBox Session.Property("MYPROPERTY")

Как элемент WiX, что-то вроде этого (не могу проверить прямо сейчас - попробуйте - не забудьте вставить в InstallUISequence или InstallExecuteSequence):

<CustomAction Id="Test" Script="vbscript">
   <![CDATA[MsgBox Session.Property("MYPROPERTY")]]>
</CustomAction>

Я считаю, что это должно помочь вам разобраться, в чем проблема на самом деле.

Вы можете использовать элемент свойства WiX, чтобы проверить условие, жестко закодировав значение напрямую (в случае, если вызов свойства набора кодов C++ является проблемой). Следующее должно сделать ваше условие запуска равным false (вызывая сообщение, которое вы указали, чтобы показать):

<Property Id='MYPROPERTY' Secure='yes' Value="YES" />
-1

Вопросы по кодированию лучше размещать на https://stackoverflow.com/

Ответ на этот вопрос намного сложнее, чем должен быть. Пожалуйста, проверьте, если этот пост заставляет вас двигаться в правильном направлении, и я проверю, чтобы увидеть, была ли ваша проблема решена: https://stackoverflow.com/questions/3252448/visual-studio-deployment-project-customactiondata

В дополнение к тому, что упоминается в этом вопросе, убедитесь, что ваше свойство указано в списке разделенных "безопасных свойств" в свойстве SecureCustomProperties .

Вся эта сложность проистекает из сложной концепции "повышенных привилегий" установщика Windows, которая позволяет пользователям без прав администратора время от времени устанавливать с повышенными правами. Чтобы это работало, к транзакциям, выполняемым с повышенными правами, нельзя получить доступ непосредственно к свойствам, и вы должны специально записать их значение в сценарий выполнения и получить их довольно экзотическим способом, как вы увидите в связанных статьях. Это включает в себя чтение свойства с именем CustomActionData.

Наконец, и это важно; опубликовать также на stackoverflow.com . У WiX может быть более продвинутый способ справиться с этой сложностью на данном этапе, о котором я не знаю. Какой-то автоматик.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .