微軟在win10下明文廢掉了GetVersionEx,不得已改用VerifyVersionInfo這個蛋疼的函數進行比對了,
但是寫了代碼無論怎樣都編譯不過,哪位大神可以幫我修改下或者指出哪裡有問題,謝謝!var 
  VsInfo: TOSVersionInfoEx;
  bl:boolean;
  dwlConditionMask: DWORDLONG;
begin
 FillChar(VsInfo,SizeOf(TOSVersionInfoEx),0);
                VsInfo.dwOSVersionInfoSize :=SizeOf(TOSVersionInfoEx);
                VSInfo.dwMajorVersion:=10;
                VSInfo.dwMinorVersion:=0;
                dwlConditionMask:=0;
                VerSetConditionMask(dwlConditionMask,VER_MAJORVERSION,VER_GREATER_EQUAL);
                VerSetConditionMask(dwlConditionMask,VER_MINORVERSION,VER_GREATER_EQUAL);
     bl:=VerifyVersionInfo(TOSVersionInfoEx(Addr(VsInfo)^),VER_MAJORVERSION and VER_MINORVERSION,dwlConditionMask) ; /*[dcc32 Error] APubUnit.pas(852): E2033 Types of actual and formal var parameters must be identical*/
                if  bl then 
                   Result :='Win10';
end;

解决方案 »

  1.   

    找到問題了,必須要用TOSVersionInfoExW(Addr(VsInfo)^才行,但是在window申明是一樣的,winapi.windows 
      
      TOSVersionInfoExW = _OSVERSIONINFOEXW;
      TOSVersionInfoEx = TOSVersionInfoExW;
      

  2.   

    可以使用ntdll的RtlGetVersion。
    GetVersionEx并没有废掉,在win10下它返回6.2,非常恰如其分地说明了win10的性质(windows7是6.1)。
      

  3.   

    很不幸,VerifyVersionInfo也不行,看來真的只能用RtlGetVerSion了
      

  4.   

    在程序中加入一个兼容性manifest就可以了,参见:https://msdn.microsoft.com/en-us/library/windows/desktop/dn481241%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
    看来ms的内核组是想把核心版本和产品版本区分开来。
      

  5.   

    都win10了啊
      

  6.   

    在win10下它返回6.2
    win10的性质(windows7是6.1) 
    差别不甚大?
      

  7.   

    核心的差别很小,win7和win8/8.1/10之间的差别也就是win2000和winxp之间的差别。