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 百度了一下,找到原因:
原来是微软搞的鬼
解决方法:
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()成功返回正确的版本数据:
本文来自博客园,作者:IT情深,转载请注明原文链接:https://www.cnblogs.com/wh445306/p/16751932.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?