Winapi 在Windows 8.1/10中正确获取Win32MajorVersion和Win32MinorVersion
我正在使用Delphi 7 Pro,需要获取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
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在下方空白处填写答案,以达到此目的。有关更多信息,请参阅。