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