2012-05-14 6 views
6

Derzeit habe ich das folgende Fragment zu überprüfen und zu installieren Windows Installer 4.5, wenn der Benutzer unter Windows   XP ist.Burn Bootstrapper erkennt Windows Installer Version nicht richtig

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

Dies ist jedoch nicht funktioniert und die Eigenschaft „WinXPx86HasInstaller“ ergibt immer falsch, auch wenn es installiert ist.

Was mache ich falsch?

Antwort

14

Es ist etwas nervig, dass es im Gegensatz zu WiX keine Möglichkeit gibt, Burn InstallConditions einfach zu testen - nur DetectConditions werden zur Laufzeit im Protokoll ausgedruckt. Nachdem er eine Weile invertiert InstallConditions als DetectConditions [*] zu testen, dieses Fragment für mich zu arbeiten scheint:

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

Super, das funktioniert Vielen Dank auch für die anderen Plattformen, ich war noch nicht dazu gekommen!;) –

+0

Ich denke, die Installationsbedingung sollte geändert werden in "(VersionNT = v5. 2 OR VersionNT = v5.1) UND VersionNT64 UND VersionMsi < v4.5 "auf dem Server 2003 x64 ExePackage. Von [link] (http://www.microsoft.com/en-us/download/details.aspx?id=8483), für Windows Server 2003 Service Pack 1, Windows Server 2003 Service Pack 2 und Windows XP 64 -bit Editionen: x64 Plattform: WindowsServer2003-KB942288-v4-x64.exe. – jchoover

+1

@jchoover Es gab nur eine 32-Bit-Version von NT 5.1: 64-Bit-XP und 2003 waren 5.2 - siehe http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724832%28v= vs.85% 29.aspx. – BCran

-1

Version NT hat die Werte 501, 502, 600 usw. Der Wert ist eine ganze Zahl: MajorVersion * 100 + MinorVersion. Verwenden Sie '501' anstelle von 'v5.1'.

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

+5

Nicht nach dem Brennen Dokumentation, http://wix.sourceforge.net/manual-wix3/bundle_built_in_variables.htm. Ich habe den Brenn-Quellcode überprüft und soweit ich sehe, sind die obigen Dokumente korrekt (C++ ist sehr rostig). Ich hatte tatsächlich 501 in meinem ursprünglichen Code, bevor ich die Diskrepanz bemerkte und es dann auch nicht funktionierte. –

+0

VersionNT ist sowohl eine Burn-Variable als auch eine MSI-Eigenschaft. In diesem Fall denke ich, dass es als eine MSI-Eigenschaft behandelt wird. – sohil

+0

Warum denkst du das? Der obige Code ist innerhalb des Burn Bootstrappers kein MSI. Auf jeden Fall habe ich beides versucht und auch nicht gearbeitet. :( –

0

Try

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

zu verwenden Und ich denke, InstallCondition in diesem Fall nicht erforderlich ist.

4

Für das, was es wert ist, glaube ich, den ursprünglichen Grund, warum Ihr Nachweis wäre versagte nur weil VersionMsi zwei Stellen hinter dem Komma hat:

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

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

hatte ich vor kurzem st rugged mit einem ähnlichen Problem und endete in Burn Graben, um die Antwort zu finden.

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; 
} 
Verwandte Themen