Jak korzystać z właściwości instalatora MSI w komunikacie warunkowym w instalatorze WiX?

0

Chcę użyć właściwości instalatora MSI w komunikacie warunkowym w instalatorze WiX. Ta właściwość MSI jest ustawiana przez akcję niestandardową C ++. Mogę ustawić i uzyskać tę samą właściwość i wartość MSI przed wywołaniem komunikatu warunku, ale nie działa, gdy używam go w komunikacie warunku.

Mój komunikat o stanie wygląda

<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>

Tutaj MyProperty jest ciągiem znaków i zwraca YES lub NO i jest ustawiany przez C ++ CA, a ten warunek nie działa w obu przypadkach. Ale chcę pokazać tę wiadomość tylko wtedy, gdy MyProperty jest ustawiona na „NIE”.

Jak więc użyć mojej niestandardowej właściwości MSI w komunikacie warunku ustawionym przez akcję niestandardową?

Ania
źródło

Odpowiedzi:

0

Chciałbym spróbować UPPERCASE właściwość MyProperty, aby to własność publiczną , a następnie chciałbym również zadeklarować go w źródle WiX pośrednictwem własności elementu i ustawić Secure attributesię Yesi sprawdzić, czy to pomaga. Znacznik WiX:

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

Pobrałbym również właściwość po ustawieniu jej w niestandardowej akcji C ++, aby ustalić, czy została ustawiona poprawnie (może być pusta). Za pomocą VBScript można bardzo łatwo pobrać właściwość. Oto przykład (VBScript pomaga uniknąć kompilacji i możesz osadzić źródło w akcji niestandardowej - świetnej do celów testowych - i używać go tylko do celów testowych):

MsgBox Session.Property("MYPROPERTY")

Jako element WiX, coś takiego (obecnie nie można przetestować - spróbuj - pamiętaj o wstawieniu w InstallUISequencelub InstallExecuteSequence):

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

Uważam, że powinno to pomóc w rozwiązaniu problemu.

Możesz użyć elementu Właściwość WiX do przetestowania warunku poprzez bezpośrednie zakodowanie wartości wprost (w przypadku, gdy wywołanie właściwości zestawu kodów C ++ stanowi problem). Poniższe powinny sprawić, że warunek uruchomienia zostanie oceniony jako fałszywy (wyzwalając komunikat, który określiłeś do wyświetlenia):

<Property Id='MYPROPERTY' Secure='yes' Value="YES" />
Stein Åsmul
źródło
-1

Pytania dotyczące kodowania lepiej umieścić na https://stackoverflow.com/

Odpowiedź na to pytanie jest o wiele bardziej skomplikowana niż powinna. Sprawdź, czy ten post prowadzi Cię we właściwym kierunku, a ja sprawdzę, czy problem został rozwiązany: https://stackoverflow.com/questions/3252448/visual-studio-deployment-project-customactiondata

Oprócz tego, o czym wspomina to pytanie, upewnij się, że twoja właściwość jest wymieniona na ograniczonej liście „bezpiecznych właściwości” we właściwości SecureCustomProperties .

Cała ta złożoność wynika ze złożonej koncepcji „podwyższonych uprawnień” Instalatora Windows, która pozwala użytkownikom niebędącym administratorami na instalację z podwyższonymi uprawnieniami. Aby to zadziałało, nie można uzyskać dostępu do właściwości bezpośrednio w transakcji, która ma podwyższone prawa, i musisz specjalnie zapisać ich wartość w skrypcie wykonawczym i pobrać je w dość egzotyczny sposób, jak zobaczycie w linkowanych artykułach. Polega na odczytaniu właściwości o nazwie CustomActionData .

Wreszcie i co ważne; publikuj również na stackoverflow.com . WiX może mieć bardziej zaawansowany sposób radzenia sobie z tą złożonością na tym etapie, którego nie jestem świadomy. Jakiś automagiczny.

Stein Åsmul
źródło
Ta odpowiedź dotyczy bardziej skomplikowanego scenariusza, w którym należy pobrać daną właściwość w trybie odroczonym - w takim przypadku należy ją zapisać w skrypcie wykonawczym i pobrać za pomocą specjalnej właściwości CustomActionData. Dość niezgrabne i prawdopodobnie nie to, o co OP pytał w tym przypadku. Zamiast tego zobacz moją nową odpowiedź.
Stein Åsmul