2012-05-14 6 views
6

Attualmente, ho il seguente frammento per controllare e installare Windows Installer 4.5 se l'utente è su Windows   XP.Burn bootstrapper non rileva correttamente la versione del programma di installazione di 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> 

Tuttavia, questo non sta funzionando e la proprietà "WinXPx86HasInstaller" restituisce sempre false anche quando viene installato.

Cosa sto sbagliando?

risposta

14

È un po 'fastidioso che, a differenza di WiX, non è possibile testare facilmente le condizioni di installazione di masterizzazione: solo le condizioni di rilevamento vengono stampate nel registro in fase di esecuzione. Dopo aver trascorso un po 'per testare invertiti InstallConditions come [*], questo frammento sembra DetectConditions a lavorare per me:

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

Impressionante che funzioni Grazie mille, grazie anche per le altre piattaforme, non avevo ancora finito di farlo!;) –

+0

Penso che la condizione di installazione debba essere cambiata in "(VersionNT = v5. 2 OR VersionNT = v5.1) AND VersionNT64 AND VersionMsi < v4.5 "sul Server 2003 x64 ExePackage. Da [collegamento] (http://www.microsoft.com/en-us/download/details.aspx?id=8483), per Windows Server 2003 Service Pack 1, Windows Server 2003 Service Pack 2 e Windows XP 64 -bit Edizioni: x64 Piattaforma: WindowsServer2003-KB942288-v4-x64.exe. – jchoover

+1

@jchoover C'era sempre una versione a 32 bit di NT 5.1: 64-bit XP e 2003 erano 5.2 - vedere http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724832%28v= vs.85% 29.aspx. – BCran

-1

La versione NT ha valori 501, 502, 600, ecc. Il valore è un numero intero: MajorVersion * 100 + MinorVersion. Usa '501' invece di 'v5.1'.

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

+5

Non secondo la documentazione di Burn, http://wix.sourceforge.net/manual-wix3/bundle_built_in_variables.htm. Ho controllato il codice sorgente di masterizzazione e, per quanto posso vedere, i documenti sopra riportati sono corretti (il C++ è molto arrugginito). In realtà avevo 501 nel mio codice originale prima di notare la discrepanza e non funzionava neanche allora. –

+0

VersionNT è sia una variabile di masterizzazione che una proprietà MSI. In questo caso, penso che sarà trattato come una proprietà MSI. – sohil

+0

Perché lo pensi? Il codice sopra riportato è all'interno del bootstrapper di Burn non un msi. In ogni caso, ho provato entrambi e nessuno dei due ha funzionato. :( –

0

Provare a usare

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

E penso che, InstallCondition non è necessario in questo caso.

4

Per quello che vale, credo che il motivo originale per spiegare perché il vostro rilevamento stava venendo a mancare sarebbe perché VersionMsi ha solo due cifre di precisione:

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

avrebbe dovuto essere

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

ho avuto di recente st rugged con un problema simile e ha finito per scavare in Burn per trovare la risposta.

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; 
} 
Problemi correlati