2014-11-03 64 views
0

WiX 3.8 Burn built-in variables包含一些描述操作系統版本的值。其中之一是NTSuitePersonal。在我期望它返回非零的操作系統上,此變量設置爲零。這阻止了我爲我的應用程序定義安裝條件。WiX Burn 3.8無法正確設置NTSuitePersonal內置變量嗎?

我寫了一個小小的C#命令行應用程序,致電GetVersionEx並檢索帶有相關標誌的OSVERSIONINFOEX structure。我在兩臺機器上運行它。如果我檢查第一臺機器,系統信息對話框顯示操作系統名稱爲「Microsoft Windows 8.1 Enterprise N」。命令行輸出如下:

wSuiteMask & VER_SUITE_PERSONAL: 0x00000100 & 0x00000200 = 0x00000000 
wSuiteMask & VER_SUITE_SINGLEUSERTS: 0x00000100 & 0x00000100 = 0x00000100 

第二臺機器顯示操作系統名稱爲「微軟的Windows 8.1」,它具有以下的輸出:

wSuiteMask & VER_SUITE_PERSONAL: 0x00000300 & 0x00000200 = 0x00000200 
wSuiteMask & VER_SUITE_SINGLEUSERTS: 0x00000300 & 0x00000100 = 0x00000100 

在此基礎上,我希望NTSuitePersonal WiX Burn內置變量在第二臺機器上不爲零,但在兩臺機器上都設置爲零。以下是我在我的日誌文件中看到:

Variable: NTSuitePersonal = 0 

有我忽略了一些東西,或者這是燒傷的缺陷?

僅供參考,我的命令行應用程序的全文如下:

using System; 
using System.Runtime.InteropServices; 

namespace OperatingSystemInfoSandbox 
{ 
    class Program 
    { 
     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
     public class OSVERSIONINFOEX 
     { 
      public int dwOSVersionInfoSize; 
      public int dwMajorVersion; 
      public int dwMinorVersion; 
      public int dwBuildNumber; 
      public int dwPlatformId; 
      [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] 
      public string szCSDVersion; 
      public UInt16 wServicePackMajor; 
      public UInt16 wServicePackMinor; 
      public UInt16 wSuiteMask; 
      public byte wProductType; 
      public byte wReserved; 
      public OSVERSIONINFOEX() 
      { 
       this.dwOSVersionInfoSize = (int)Marshal.SizeOf(typeof(OSVERSIONINFOEX)); 
      } 
     } 

     [return: MarshalAs(UnmanagedType.Bool)] 
     [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
     public static extern bool GetVersionEx([In, Out] OSVERSIONINFOEX osvi); 

     public const UInt16 VER_SUITE_PERSONAL = 0x00000200; 
     public const UInt16 VER_SUITE_SINGLEUSERTS = 0x00000100; 

     static void Main(string[] args) 
     { 
      var osvi = new OSVERSIONINFOEX(); 
      GetVersionEx(osvi); 
      Console.WriteLine("wSuiteMask & VER_SUITE_PERSONAL: 0x{0:x8} & 0x{1:x8} = 0x{2:x8}", 
       osvi.wSuiteMask, VER_SUITE_PERSONAL, osvi.wSuiteMask & VER_SUITE_PERSONAL); 
      Console.WriteLine("wSuiteMask & VER_SUITE_SINGLEUSERTS: 0x{0:x8} & 0x{1:x8} = 0x{2:x8}", 
       osvi.wSuiteMask, VER_SUITE_SINGLEUSERTS, osvi.wSuiteMask & VER_SUITE_SINGLEUSERTS); 
      Console.ReadKey(); 
     }   
    } 
} 

回答

1

請提交錯誤報告。看起來它沒有正確檢查蒙版。

+0

謝謝,鮑勃!這是一個權威立場的答案。 :-)我已提交[問題4580](http://wixtoolset.org/issues/4580/)。 – 2014-11-04 13:49:37