------------------------------------------------------------------------------------------------- [ENHANCED] VFP 9.0 FIX - THE OS() FUNCTION RETURNS THE NEW OPERATING SYSTEM INFORMATION January 2024 ------------------------------------------------------------------------------------------------- CCB 1. BUG: In vfp9 (and vfp6, vfp7, vfp8), the OS() function always returns "Windows 6.02" on Windows 8.1 or later. In VFP Advanced, usually the OS() function returns "Windows 10.00" on Windows 10. For backward compatibility, we can disable the OS() function returns the new operating system information, then the OS() function will return "Windows 6.02" on Windows 8.1 or later. There is a program for test: *PROC testosfunction SET STEP OFF SET ECHO OFF SET DEBUG OFF SET ESCAPE OFF SET TALK OFF SET SAFETY OFF _SCREEN.VISIBLE=.T. _SCREEN.WINDOWSTATE=2 SET EXCLUSIVE OFF SET MULTILOCK ON SET COLLATE TO "MACHINE" CLOSE DATABASES ALL CLOSE TABLES ALL ?"OS() = "+OS() ?"OS(1) = "+OS(1) ?"OS(2) = "+OS(2) ?"OS(3) = "+OS(3) ?"OS(4) = "+OS(4) ?"OS(5) = "+OS(5) ?"OS(6) = "+OS(6) ?"OS(7) = "+OS(7) ?"OS(8) = "+OS(8) ?"OS(9) = "+OS(9) ?"OS(10) = "+OS(10) ?"OS(11) = "+OS(11) WAIT CLOSE DATABASES ALL CLOSE TABLES ALL RETURN * END OF PROC TESTOSFUNCTION. 2. CAUSE: For some reasons, the GetVersion and GetVersionEx Windows API can't work correctly on Windows 8.1 or later, please refer to: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx In vfp9 (and vfp6, vfp7, vfp8), the OS() function uses the GetVersionEx Windows API to get the operating system version information, so it always returns "Windows 6.02" on Windows 8.1 or later. 3. RESOLUTION: We can write some code to fix the BUG. vfpa_getversionexa :: ; proc near push ebp mov ebp,esp sub esp,04h push ebx push esi push edi mov eax,dword ptr [ebp+08h] push eax call GetVersionExA mov dword ptr [ebp-04h],eax cmp dword ptr vfpa_sys9019_data,00h je vfpa_getversionexa_end mov edi,dword ptr [ebp+08h] ; dwMajorVersion mov eax,dword ptr fs:[30h] mov eax,dword ptr [eax+0A4h] mov dword ptr [edi+04h],eax ; dwMinorVersion mov eax,dword ptr fs:[30h] mov eax,dword ptr [eax+0A8h] mov dword ptr [edi+08h],eax ; dwBuildNumber mov eax,dword ptr fs:[30h] movzx eax,word ptr [eax+0ACh] mov dword ptr [edi+0Ch],eax ; dwPlatformId mov eax,dword ptr fs:[30h] mov eax,dword ptr [eax+0B0h] mov dword ptr [edi+10h],eax vfpa_getversionexa_end: pop edi pop esi pop ebx mov eax,dword ptr [ebp-04h] mov esp,ebp pop ebp ret 04h ; vfpa_getversionexa endp We can use the vfpa_getversionexa() function instead of the GetVersionEx Windows API, then the OS() function can return the operating system version information correctly on Windows 8.1 or later. Please refer to the picture os-windows10.jpg: 4. APPLIES TO: VFP 6.0.8167.0 VFP 6.0.8961.0 (SP5) VFP 7.0.0.9262 VFP 7.0.0.9465 (SP1) VFP 8.0.0.2521 VFP 8.0.0.3117 (SP1) VFP 9.0.0.2412 VFP 9.0.0.3504 (SP1) VFP 9.0.0.4611 (SP2) VFP 9.0.0.5015 (SP2) VFP 9.0.0.5411 (SP2) VFP 9.0.0.5721 (SP2) VFP 9.0.0.5815 (SP2) VFP 9.0.0.6303 (SP2) VFP 9.0.0.6602 (SP2) VFP 9.0.0.7423 (SP2) The bug has been fixed in VFP Advanced. IMPORTANT NOTE: Please use the OS() function carefully. For example, the following code can not run fine in VFP Advanced: IF OS(3) >= "6" && OS(3) = "10" on Windows 10 in VFP Advanced, it's wrong! Recommend to use the following code: IF VAL(OS(3)) >= 6 && VAL(OS(3)) = 10 on Windows 10 in VFP Advanced, it's ok. 5. REFERENCE WEBSITES: 1, baiyujia.com: http://www.baiyujia.com http://www.baiyujia.com/vfpdocuments/f_vfp9fix78.asp 2, microsoft.com: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms724832(v=vs.85).aspx 3, foxite.com: https://www.foxite.com/archives/detect-difference-between-8-and-81-0000420484.htm https://www.foxite.com/archives/exporttoxlsx-vfp-10-tochuanbing-chen-0000434139.htm 4, mattslay.com: http://www.mattslay.com/does-microsoft-visual-foxpro-run-on-windows-10/ 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |