2010-03-16 8 views
17

Z powodu zamieszania użytkownika nasza aplikacja wymaga osobnych instalatorów dla 32-bitowych i 64-bitowych wersji systemu Windows. Chociaż 32-bitowy instalator działa dobrze na win64, może potencjalnie wywoływać bóle wsparcia i chcielibyśmy temu zapobiec.WiX: Zapobieganie uruchamianiu 32-bitowego instalatora w 64-bitowym systemie Windows

Chcę zapobiec uruchamianiu 32-bitowego instalatora MSI na 64-bitowych komputerach z systemem Windows. W tym celu mam następujący warunek:

<Condition Message="You are attempting to run the 32-bit installer on a 64-bit version of Windows."> 
    <![CDATA[Msix64 AND (NOT Win64)]]> 
</Condition> 

Z Win64 zdefiniowane następująco:

<?if $(var.Platform) = "x64"?> 
<?define PlatformString = "64-bit"?> 
<?define Win64 ?> 
<?else?> 
<?define PlatformString = "32-bit"?> 
<?endif?> 

Rzecz w tym, że nie może dostać ten czek do pracy w prawo. Albo strzela cały czas, albo nie ma czasu. Celem jest sprawdzenie obecności zmiennej wykonawczej msix64 względem zmiennej kompilacyjnej Win64 i zgłoszenie błędu, jeśli nie są one zgodne, ale logika nie działa tak, jak zamierzam. Czy ktoś wymyślił lepsze rozwiązanie?

Odpowiedz

15

Dołącz element Condition tylko w pakiecie 32-bitowym (tj. Używając? If if? instrukcja preprocesora). Warunkiem jest "NOT Msix64": warunki uruchamiania muszą być prawdziwe, więc jeśli ustawiona jest opcja Msix64, warunek uruchamiania zakończy się niepowodzeniem, co oznacza, że ​​jest to system operacyjny x64 i pakiet 32-bitowy, a poprawną rzeczą jest blok.

+0

W ten sposób udało się. Moim błędem było uzyskanie logiki wstecz dla "warunku". –

+1

Msix64 wymaga Instalatora Windows 3.1, który nie jest domyślnie zainstalowany w systemie XP (patrz http://msdn.microsoft.com/en-us/library/aa370522(v=VS.85).aspx) –

3

Element warunku działa z właściwościami instalatora systemu Windows, które istnieją podczas instalacji.

Jednak definiujesz Win64 jako zmienną wix, a nie właściwość instalatora systemu Windows. Zmienne Wix istnieją tylko podczas tworzenia instalacji. Musisz odwoływać się do nich jako $(var.MyWixVariable) gdzie ich używasz, a preprocesor wix zastąpi je ich określoną wartością.

chciałbym spróbować to zamiast:

<?if $(var.Platform) = "x64"?> 
<?define PlatformString = "64-bit"?> 
<Property Id="Win64" Value="1" /> 
<?else?> 
<?define PlatformString = "32-bit"?> 
<?endif?> 

Jeśli $(var.Platform) ma właściwą wartość, gdy konfiguracja jest tworzony, to spowoduje „Win64” własność być rejestrowane w bazie danych Instalator Windows (czyli MSI plik), a właściwość będzie dostępna podczas instalacji do użycia w elemencie warunku.

+0

ten generuje błąd, gdy prowadzony przez światła na Wix 3.6 wskazuje, że zagnieżdżony elementem nieruchomości nie mogą być umieszczone ze składnią . – Jon

+0

@JonSamwell: Te instrukcje przetwarzania ('') są przeznaczone dla preprocesora w candle.exe. Light.exe nigdy nie powinien ich widzieć, jeśli używasz poprawnie wix. –

3

Dodaj ten warunek

<Condition Message="This is designed for 32bit OS">%PROCESSOR_ARCHITECTURE ~= "x86" AND %PROCESSOR_ARCHITEW6432 &lt;&gt; "amd64"></Condition> 

Można by utworzyć jeden instalator ze składnikiem 32bit i składnik 64bit i umieścić te dwa warunki w poszczególnych komponentów

<Component Id="bit32Component" Guid="..." Feature="ProductFeature"> 
    <Condition>%PROCESSOR_ARCHITECTURE~="x86" AND %PROCESSOR_ARCHITEW6432&lt;&gt;"amd64"></Condition> 
</Component> 
<Component Id="bit64Component" Guid="..." Feature="ProductFeature"> 
    <Condition>%PROCESSOR_ARCHITECTURE~="amd64" OR %PROCESSOR_ARCHITEW6432~="amd64"></Condition> 
</Component> 

tu jest odniesienie użyłem

http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx

6

Używamy następujących ...

<?if $(var.ProcessorArchitecture)=x86 ?> 
<Condition Message="!(loc.LaunchCondition_Error64)"> 
    <![CDATA[Installed OR Not VersionNT64]]> 
</Condition> 
<?endif?> 
+1

VersionNT64 wymaga Instalatora Windows 4.0 (zobacz http://msdn.microsoft.com/en-us/library/windows/desktop/aa372497.aspx) –

Powiązane problemy