Delphi2007,XE2 调用GetVersionEx在Win10下为6.1的原因及解决方法

procedure TForm1.Button2Click(Sender: TObject);
var
  OsInfo: TOSVersionInfo;
const
  s = '主编号: %d' + sLineBreak +
      '次编号: %d' + sLineBreak +
      '建立编号: %d' + sLineBreak +
      '作业平台: %d' + sLineBreak +
      '更多说明: %s';
begin
  OsInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); {先根据大小要内存}

  GetVersionEx(OsInfo);
  ShowMessage(Format(s, [OsInfo.dwMajorVersion,
                         OsInfo.dwMinorVersion,
                         OsInfo.dwBuildNumber,
                         OsInfo.dwPlatformId,
                         OsInfo.szCSDVersion]));
end;

Delphi2007,XE2下居然均返回6.1,而在最新的Delphi10.x下是正常的,可以取到正确的10.0 百度了一下,找到原因:

原来是微软搞的鬼

https://docs.microsoft.com/zh-cn/windows/win32/api/sysinfoapi/nf-sysinfoapi-getversionexa?redirectedfrom=%20MSDN

解决方法:

DelphiXE以下的版本没有自定义.manifest功能的,将下列内容复制保存为xxx.manifest,编码为UTF-8,并编译为res文件加入dpr文件中编译为资源文件问题即可解决

<?xml version="1.0" encoding="UTF-8"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <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> 

 

操作顺序:

1,将文件保存为:win10.rc

1 24 win10.manifest

//1,代表资源编号
//24,资源类型为RTMAINIFEST

2,将RC文件编译为资源文件

brcc32.exe  win10.rc 

3,生成win10.RES 文件
4,打开工程文件(DPR)
在{$R *.RES}后面追加
{$R 'win10.RES'}
编译工程文件,得到EXE文件:
(注意:生成的EXE要单独执行才会加载这个.manifest文件,在IDE中运行是无效的,特别提醒)

DelphiXE以上直接如下图加入该.manifest文件编译即可

运行程序GetVersionEx()成功返回正确的版本数据:

posted @ 2022-10-04 00:15  IT情深  阅读(98)  评论(0编辑  收藏  举报