DECLARE INTEGER DllGetVersion IN shell32 STRING @pdvi LOCAL lcBuffer lcBuffer = Chr(20) + Repli(Chr(0), 19) IF DllGetVersion(@lcBuffer) = 0 ? "Major version:", buf2dword(SUBSTR(lcBuffer, 5,4)) ? "Minor version:", buf2dword(SUBSTR(lcBuffer, 9,4)) ? "Build number: ", buf2dword(SUBSTR(lcBuffer, 13,4)) ? "Platform: ", Iif(buf2dword(SUBSTR(lcBuffer, 17,4))=1,; "Windows", "WinNT") ENDIF FUNCTION buf2dword(lcBuffer) RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ; BitLShift(Asc(SUBSTR(lcBuffer, 2,1)), 8) +; BitLShift(Asc(SUBSTR(lcBuffer, 3,1)), 16) +; BitLShift(Asc(SUBSTR(lcBuffer, 4,1)), 24)The DllGetVersion populates DLLVERSIONINFO structure that consists of five DWORDs:
*|typedef struct _DllVersionInfo { *| DWORD cbSize; 0:4 *| DWORD dwMajorVersion; 4:4 *| DWORD dwMinorVersion; 8:4 *| DWORD dwBuildNumber; 12:4 *| DWORD dwPlatformID; 16:4 *|} DLLVERSIONINFO; total bytes = 20The easiest way to pass such structure to the function is using a FoxPro string. As you can see, lcBuffer contains exactly 20 bytes (5x4). Its first DWORD is set to the length of the structure. This is a requirement for this particular API call. Note that the buffer is passed to the function by reference.