2014-11-03 6 views
0

WiX 3.8 번 built-in variables에는 운영 체제 버전을 설명하는 몇 가지 값이 포함되어 있습니다. 이 중 하나는 NTSuitePersonal입니다. 이 변수는 0이 아닌 값으로 반환 할 것으로 예상되는 운영 체제에서 0으로 설정됩니다. 이로 인해 제 응용 프로그램의 설치 조건이 정의되지 않습니다.WiX Burn 3.8이 NTSuitePersonal 기본 제공 변수를 올바르게 설정하지 못합니까?

GetVersionEx을 호출하고 관련 플래그가있는 OSVERSIONINFOEX structure을 검색하기 위해 약간의 C# 명령 줄 앱을 작성했습니다. 두 대의 컴퓨터에서 실행하고 있습니다. 첫 번째 컴퓨터를 확인하면 시스템 정보 대화 상자에 OS 이름이 "Microsoft Windows 8.1 Enterprise N"으로 표시됩니다.

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

두 번째 기계는 "마이크로 소프트 윈도우 8.1"로 OS 이름을 표시하고, 결과는 다음과 같습니다 : 명령 줄 출력은 다음과 같다이를 바탕으로

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

, 나는 기대를 NTSuitePersonal WiX Burn 내장 변수가 두 번째 시스템에서 0이 아닌 값으로 설정되지만 두 변수 모두에서 0으로 설정됩니다. 로그 파일에 다음과 같이 표시됩니다.

Variable: NTSuitePersonal = 0 

내가 간과했거나 Burn의 결함입니까?

는 참고로, 내 명령 줄 응용 프로그램의 전체 내용은 다음과 같습니다

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

감사합니다. Bob! 그것은 권위의 입장에서의 대답입니다. :-) [issue 4580] (http://wixtoolset.org/issues/4580/)을 제출했습니다. –