2012-05-14 9 views
6

Obecnie mam następujący fragment, aby sprawdzić i zainstalować Instalatora Windows 4.5, jeśli użytkownik jest w systemie Windows   XP.Burn bootstrapper nie wykrywa poprawnie wersji instalatora Windows

<Fragment> 
    <Property Id="WinXPx86HasInstaller"> 
     <![CDATA[VersionNT = 'v5.1' AND VersionMsi >= "4.5.6001.22159"]]> 
    </Property> 

    <PackageGroup Id="Windows.Installer.4.5"> 
     <ExePackage Id="WinXp_x86" 
        Cache="no" 
        Compressed="no" 
        PerMachine="yes" 
        Permanent="yes" 
        Vital="yes" 
        InstallCommand="/norestart /passive" 
        SourceFile="WindowsXP-KB942288-v3-x86.exe" 
        DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsXP-KB942288-v3-x86.exe" 
        DetectCondition="WinXPx86HasInstaller" 
        InstallCondition="NOT WinXPx86HasInstaller"> 
      <ExitCode Behavior="forceReboot" /> 
     </ExePackage> 
    </PackageGroup> 
</Fragment> 

Jednak to nie działa, a właściwość „WinXPx86HasInstaller” zawsze ma wartość false, nawet gdy jest on zainstalowany.

Co robię źle?

Odpowiedz

14

To dość irytujące, że w przeciwieństwie do WiX, nie ma możliwości łatwego przetestowania Burn InstallConditions - tylko DetectConditions są drukowane w dzienniku w czasie wykonywania. Po spędzeniu trochę czasu, aby przetestować odwrócone InstallConditions jak DetectConditions [*] Ten fragment wydaje się działać dla mnie:

<!-- Windows Installer 4.5 --> 
<Fragment> 
    <PackageGroup Id="WindowsInstaller45"> 
     <ExePackage 
      Cache="no" 
      Compressed="no" 
      PerMachine="yes" 
      Permanent="yes" 
      Vital="yes" 
      SourceFile="redist\WindowsXP-KB942288-v3-x86.exe" 
      DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsXP-KB942288-v3-x86.exe" 
      InstallCondition="VersionNT=v5.1 AND NOT VersionNT64 AND VersionMsi &lt; v4.5" 
      InstallCommand="/quiet /norestart"> 
      <ExitCode Behavior="forceReboot"/> 
     </ExePackage> 
     <ExePackage 
      Cache="no" 
      Compressed="no" 
      PerMachine="yes" 
      Permanent="yes" 
      Vital="yes" 
      SourceFile="redist\WindowsServer2003-KB942288-v4-x86.exe" 
      DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsServer2003-KB942288-v4-x86.exe" 
      InstallCondition="VersionNT=v5.2 AND NOT VersionNT64 AND VersionMsi &lt; v4.5" 
      InstallCommand="/quiet /norestart"> 
      <ExitCode Behavior="forceReboot"/> 
     </ExePackage> 
     <ExePackage 
      Cache="no" 
      Compressed="no" 
      PerMachine="yes" 
      Permanent="yes" 
      Vital="yes" 
      SourceFile="redist\WindowsServer2003-KB942288-v4-x64.exe" 
      DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/WindowsServer2003-KB942288-v4-x64.exe" 
      InstallCondition="VersionNT=v5.2 AND VersionNT64 AND VersionMsi &lt; v4.5" 
      InstallCommand="/quiet /norestart"> 
      <ExitCode Behavior="forceReboot"/> 
     </ExePackage> 
     <MsuPackage 
      Cache="no" 
      Compressed="no" 
      Permanent="yes" 
      Vital="yes" 
      KB="KB942288" 
      SourceFile="redist\Windows6.0-KB942288-v2-x86.msu" 
      DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x86.msu" 
      InstallCondition="VersionNT=v6.0 AND NOT VersionNT64 AND VersionMsi &lt; v4.5"/> 
     <MsuPackage 
      Cache="no" 
      Compressed="no" 
      Permanent="yes" 
      Vital="yes" 
      KB="KB942288" 
      SourceFile="redist\Windows6.0-KB942288-v2-x64.msu" 
      DownloadUrl="http://download.microsoft.com/download/2/6/1/261fca42-22c0-4f91-9451-0e0f2e08356d/Windows6.0-KB942288-v2-x64.msu" 
      InstallCondition="VersionNT=v6.0 AND VersionNT64 AND VersionMsi &lt; v4.5"/> 
    </PackageGroup> 
</Fragment> 
+0

Fantastyczny, który działa Dziękuję bardzo za inne platformy, nie miałem jeszcze okazji, aby to zrobić jeszcze!;) –

+0

Myślę, że warunek instalacji powinien zostać zmieniony na "(VersionNT = v5. 2 LUB wersjaNT = v5.1) Oraz wersjaNT64 i wersjaMsi < v4.5 "na ExePackage Server 2003 x64. Od [link] (http://www.microsoft.com/en-us/download/details.aspx?id=8483), W przypadku systemu Windows Server 2003 z dodatkiem Service Pack 1, Windows Server 2003 Service Pack 2 i Windows XP 64 -bitowe wersje: x64 Platforma: WindowsServer2003-KB942288-v4-x64.exe. – jchoover

+1

@jchoover Była tylko 32-bitowa wersja NT 5.1: 64-bit XP i 2003 była 5.2 - patrz http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724832%28v= vs.85% 29.aspx. – BCran

-1

Wersja NT ma wartości 501, 502, 600 itd. Wartość jest liczbą całkowitą: MajorVersion * 100 + MinorVersion. Użyj "501" zamiast "v5.1".

Źródło: http://msdn.microsoft.com/en-us/library/windows/desktop/aa372495%28v=vs.85%29.aspx

+5

Nie zgodnie z dokumentacją Burn, http://wix.sourceforge.net/manual-wix3/bundle_built_in_variables.htm. Sprawdziłem kod źródłowy nagrywania i o ile widzę, powyższe dokumenty są poprawne (C++ jest bardzo zardzewiałe). Właściwie miałem 501 w moim oryginalnym kodzie, zanim zauważyłem rozbieżność i wtedy też nie działało. –

+0

VersionNT jest zarówno zmienną Burn, jak i właściwością MSI. W tym przypadku myślę, że będzie to traktowane jako własność MSI. – sohil

+0

Dlaczego tak uważasz? Powyższy kod znajduje się wewnątrz programu Burn bootstrapper, a nie msi. W każdym razie próbowałem obu i żadnej pracy. :( –

0

spróbuje użyć

DetectCondition="VersionMsi >= v4.5 AND VersionNT = 501 AND NOT VersionNT64" 

I myślę, InstallCondition nie jest konieczne w tym przypadku.

4

Na co warto, wierzę pierwotną przyczynę, dlaczego Twój detekcji braku byłoby bo VersionMsi ma tylko dwie cyfry dokładność:

<![CDATA[VersionNT = 'v5.1' AND VersionMsi >= "4.5.6001.22159"]]> 

powinien być

<![CDATA[VersionNT = 'v5.1' AND VersionMsi >= v4.5]]> 

miałem niedawno st ruggled z podobnym problemem i skończył kopać w Burn, aby znaleźć odpowiedź.

static HRESULT InitializeVariableVersionMsi(
__in DWORD_PTR dwpData, 
__inout BURN_VARIANT* pValue 
) 
{ 
    UNREFERENCED_PARAMETER(dwpData); 

    HRESULT hr = S_OK; 
    DLLGETVERSIONPROC pfnMsiDllGetVersion = NULL; 
    DLLVERSIONINFO msiVersionInfo = { }; 

    // Get DllGetVersion proc address 
    pfnMsiDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(::GetModuleHandleW(L"msi"), "DllGetVersion"); 
    ExitOnNullWithLastError(pfnMsiDllGetVersion, hr, "Failed to find DllGetVersion entry point in msi.dll."); 

    // Get msi.dll version information 
    msiVersionInfo.cbSize = sizeof(DLLVERSIONINFO); 
    hr = pfnMsiDllGetVersion(&msiVersionInfo); 
    ExitOnFailure(hr, "Failed to get msi.dll version info."); 

    hr = BVariantSetVersion(pValue, MAKEQWORDVERSION(msiVersionInfo.dwMajorVersion, msiVersionInfo.dwMinorVersion, 0, 0)); 
    ExitOnFailure(hr, "Failed to set variant value."); 

    LExit: 
    return hr; 
} 
Powiązane problemy