巧妙解决程序运行在兼容模式下时window版本欺诈问题

来源:互联网 发布:ie浏览器无法登录淘宝 编辑:程序博客网 时间:2024/06/03 13:30
   有时候,我们想获取系统的版本号,根据版本号为软件做特定的设置。
   通常情况下我们会调用系统API函数GetVersionEx来获取系统版本号,但是,如果软件是以兼容模式运行的话,将会发生window版本欺诈的问题,这个GetVersionEx不能正确获取系统版本,只能获取兼容模式下的系统版本,那么该如何解决呢?

    在系统目录C:\Windows\System32下有个程序ntoskrnl.exe,该程序的版本与系统版本一致,我们可以获取该程序的版本号,以此在我们的软件中获取系统的正确版本号,下面是Delphi的实现代码


 type    PVerInfo = ^TVS_FIXEDFILEINFO;    TVS_FIXEDFILEINFO = record      dwSignature: longint;      dwStrucVersion: longint;      dwFileVersionMS: longint;      dwFileVersionLS: longint;      dwFileFlagsMask: longint;      dwFileFlags: longint;      dwFileOS: longint;      dwFileType: longint;      dwFileSubtype: longint;      dwFileDateMS: longint;      dwFileDateLS: longint;    end;  var    ExeNames: array[0..255] of char;    zKeyPath: array[0..255] of Char;    VerInfo: PVerInfo;    Buf: pointer;    Sz: word;    L, Len: Cardinal;begin   ExeNames :='C:\Windows\System32\ntoskrnl.exe';  Sz := GetFileVersionInfoSize(ExeNames, L);  if Sz=0 then  begin    WindowVerson := -1;    Exit;  end;  try    GetMem(Buf, Sz);    try      GetFileVersionInfo(ExeNames, 0, Sz, Buf);      if VerQueryValue(Buf, '\', Pointer(VerInfo), Len) then      begin        WindowVerson:=HIWORD(VerInfo.dwFileVersionMS);      end;    finally      FreeMem(Buf);    end;  except    WindowVerson := -1;  endend;
0 0
原创粉丝点击