2012-05-14 15 views
6

Actualmente, tengo el siguiente fragmento para verificar e instalar Windows Installer 4.5 si el usuario está en Windows   XP.Burn bootstrapper no está detectando la versión del instalador de Windows correctamente

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

Sin embargo, esto no está funcionando y la propiedad "WinXPx86HasInstaller" siempre se evalúa como falsa, incluso cuando está instalado.

¿Qué estoy haciendo mal?

Respuesta

14

Es algo molesto que, a diferencia de WiX, no haya forma de probar fácilmente Burn InstallConditions; solo DetectConditions se imprimen en el registro en tiempo de ejecución. Después de pasar un tiempo para poner a prueba invertidas InstallConditions como DetectConditions [*], este fragmento parece funcionar para mí:

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

Impresionante que funciona perfectamente. Muchas gracias. ¡Gracias también por las otras plataformas, aún no las había hecho!;) –

+0

Creo que la condición de instalación debería cambiarse a "(VersionNT = v5. 2 OR VersionNT = v5.1) Y VersionNT64 Y VersionMsi < v4.5 "en Server 2003 x64 ExePackage. Desde [enlace] (http://www.microsoft.com/en-us/download/details.aspx?id=8483), para Windows Server 2003 Service Pack 1, Windows Server 2003 Service Pack 2 y Windows XP 64 -bit Editions: x64 Plataforma: WindowsServer2003-KB942288-v4-x64.exe. – jchoover

+1

@jchoover Solo había una versión de NT-bit 5.1 de 32 bits: XP de 64 bits y 2003 eran 5.2; consulte http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724832%28v= vs.85% 29.aspx. – BCran

-1

La versión NT tiene los valores 501, 502, 600, etc. El valor es un número entero: MajorVersion * 100 + MinorVersion. Use '501' en lugar de 'v5.1'.

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

+5

No de acuerdo con la documentación Burn, http://wix.sourceforge.net/manual-wix3/bundle_built_in_variables.htm. He comprobado el código fuente de grabación y, por lo que puedo ver, los documentos anteriores son correctos (C++ está muy oxidado). De hecho, tenía 501 en mi código original antes de notar la discrepancia y tampoco funcionó. –

+0

VersionNT es una variable de Burn y una propiedad de MSI. En este caso, creo que se tratará como una propiedad de MSI. – sohil

+0

¿Por qué piensas eso? El código anterior está dentro del Burn bootstrapper no un msi. En cualquier caso, he intentado ambos y ninguno de los dos funciona. :( –

0

Intente utilizar

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

Y creo, InstallCondition no es necesario en este caso.

4

Por lo que vale la pena, creo que la razón original de por qué su detección estaba fallando sería porque VersionMsi tiene solamente dos dígitos de precisión:

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

debería haber sido

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

que tuve hace poco st Rugged con un problema similar y terminó cavando en Burn para encontrar la respuesta.

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; 
} 
Cuestiones relacionadas