Winapi 在Windows 8.1/10中正确获取Win32MajorVersion和Win32MinorVersion

Winapi 在Windows 8.1/10中正确获取Win32MajorVersion和Win32MinorVersion,winapi,delphi-7,Winapi,Delphi 7,我正在使用Delphi 7 Pro,需要获取Win32MajorVersion和Win32MinorVersion,以便区分Windows XP、Vista、7、8、8.1和10 经过几个小时的研究(对不起,英语不是我的母语),我明白我需要更改清单文件以支持Windows 8.1和10。以下是我得到的: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-mic

我正在使用Delphi 7 Pro,需要获取
Win32MajorVersion
Win32MinorVersion
,以便区分Windows XP、Vista、7、8、8.1和10

经过几个小时的研究(对不起,英语不是我的母语),我明白我需要更改清单文件以支持Windows 8.1和10。以下是我得到的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity type="win32" name="WinApp" version="11.0.2804.9245" processorArchitecture="*"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="False"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
      <!-- Windows 10 --> 
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
      <!-- Windows Vista -->
      <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
    </application> 
  </compatibility>
</assembly>

但即使包含了此清单,
win32majorvision
Win32MinorVersion
仍然在Windows 8.1和10上给我错误的信息

拜托,我做错什么了


顺便说一句,我发现其他SOF帖子有其他不使用清单文件的技术,比如使用WMI、Windows注册表等,但出于我的目的,我认为清单将是最简单有效的方式。

基于
RbMm
评论和
Remy Lebeau先生的评论,我研究了更多,并创建了下面的解决方案。尽管它正在工作(对于Delphi7),但可能需要一些改进。希望它能帮助其他有同样要求的人。谢谢

procedure TForm1.Button1Click(Sender: TObject);
type
  _OSVERSIONINFOEXW = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array [0..127] of WCHAR;
    wServicePackMajor: WORD;
    wServicePackMinor: WORD;
    wSuiteMask: WORD;
    wProductType: BYTE;
    wReserved: BYTE;
  end;
  RTL_OSVERSIONINFOEXW = _OSVERSIONINFOEXW;
  pfnRtlGetVersion = function(var RTL_OSVERSIONINFOEXW): LongInt; stdcall;
var
  OS: RTL_OSVERSIONINFOEXW;
  RtlGetVersion: pfnRtlGetVersion;
begin
  @RtlGetVersion := GetProcAddress(GetModuleHandle('ntdll.dll'), 'RtlGetVersion');
  if Assigned(RtlGetVersion) then
  begin
    ZeroMemory(@OS, SizeOf(OS));
    OS.dwOSVersionInfoSize := SizeOf(OS);
    if (RtlGetVersion(OS) = 0) then
    begin
      Memo1.Lines.Add('MajorVersion: ' + IntToStr(OS.dwMajorVersion));
      Memo1.Lines.Add('MinorVersion: ' + IntToStr(OS.dwMinorVersion));
      Memo1.Lines.Add('BuildNumber: ' + IntToStr(OS.dwBuildNumber));
      Memo1.Lines.Add('ServicePackMajor: ' + IntToStr(OS.wServicePackMajor));
      Memo1.Lines.Add('ServicePackMinor: ' + IntToStr(OS.wServicePackMinor));
      Memo1.Lines.Add(OS.szCSDVersion);
    end;
  end;
end;

大多数只需调用
RtlGetVersion
RtlGetNtVersionNumbers
,而不需要硬编码manifest@RbMm请您用最简单的代码示例
RtlGetVersion
回答,这样我就可以测试并接受答案了吗?
RTL_osversioninfo ovi={sizeof(ovi)};如果(0我正在使用Delphi 7,但我想我得到了一个功能代码。我必须将其作为观察添加到帖子问题中吗?还是必须回答我自己的问题?尽管它有效,但我不确定它是否100%正确。我已回滚了您的编辑。在此处将解决方案编辑到您的问题中是不合适的。如果您找到了一个想要共享的解决方案,请执行以下操作:o在下方空白处填写答案,以达到此目的。有关更多信息,请参阅。