2012-05-14 14 views
6

Şu anda, kontrol ve kullanıcı, Windows XP   açıksa, Windows Installer 4.5 yüklemek için aşağıdaki fragman var.Yanık bootstrapper Windows Installer sürümünü algılamıyor doğru

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

Ancak bu çalışmıyor ve mülkiyet "WinXPx86HasInstaller" her zaman yüklü olduğu zaman bile yanlış olarak değerlendirir.

Neyi yanlış yapıyorum?

cevap

14

O WiX aksine kolayca Yanık InstallConditions test etmek yolu yoktur, bu biraz sinir bozucu - sadece DetectConditions zamanında günlüğüne dışarı basılır. DetectConditions [*], bu fragman benim için çalışmak göründüğü gibi bir süre ters InstallConditions test etmek geçirdikten sonra:

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

Müthiş olduğunu eserleri Çok teşekkür ederim. Diğer platformlar için de teşekkürler, bunları henüz yapmadım!;) –

+0

Yükleme koşulunun "(VersionNT = v5) olarak değiştirilmesi gerektiğini düşünüyorum. Server 2003 x64 ExePackage üzerinde 2 VEYA VersionNT = v5.1) VE SürümNT64 VE SürümMsi < v4.5 ". [bağlantı] 'dan (http://www.microsoft.com/en-us/download/details.aspx?id=8483), Windows Server 2003 Service Pack 1 için, Windows Server 2003 Service Pack 2 ve Windows XP 64 -bit Sürümleri: x64 Platform: WindowsServer2003-KB942288-v4-x64.exe. – jchoover

+1

@jchoover NT 5.1'in yalnızca 32-bit bir sürümü vardı: 64-bit XP ve 2003 5.2 idi - bkz. Http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724832%28v= vs% 85 29.aspx. – BCran

-1

şekli NT sahip 501, 502, 600 değerleri, vs. değer bir tamsayıdır: MajorVersion * 100 + minorVersion. 'V5.1' yerine '501' kullanın.

Kaynak: http://msdn.microsoft.com/en-us/library/windows/desktop/aa372495%28v=vs.85%29.aspx

+5

Yanık belgelerine göre, http://wix.sourceforge.net/manual-wix3/bundle_built_in_variables.htm. Yanık kaynak kodunu kontrol ettim ve yukarıdaki belgelerin doğru olduğunu görebildiğim kadarıyla (C++ çok paslı). Farksızlığı fark etmeden önce orijinal kodumda 501 vardı ve o da işe yaramadı. –

+0

SürümNT, bir Yanık değişkeni ve bir MSI özelliği. Bu durumda, bir MSI özelliği olarak ele alınacağını düşünüyorum. – sohil

+0

Neden böyle düşünüyorsunuz? Yukarıdaki kod bir msi değil Burn bootstrapper içinde. Her halükarda ikisini de denedim ve ne işe yaramadı. :( –

0

deneyin

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

kullanmak Ve InstallCondition bu durumda gerekli değildir, düşünüyorum.

4

Ne olursa olsun, ben neden algılama olacağını başarısız oldu için orijinal nedeni inanıyoruz VersionMsi sadece hassas iki basamağını çünkü:

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

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

olmalıydı I inci geçenlerde vardı Benzer bir sorunla dolu ve cevabı bulmak için Burn içine kazma bitti.

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; 
} 
İlgili konular