1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
* VfpVersionFromExeOrDll.PRG
FUNCTION VfpVersionFromExeOrDll
LPARAMETERS tcExeDllName
LOCAL lcSig, lnHandle, lcVersion, lcBuffer, lnPos, lcSigMT
lcSig = "VisualFoxProRuntime."
lcSigMT = "VisualFoxProRuntimeMT."
lcVersion = "(Unknown)"
lnHandle = FOPEN(tcExeDllName, 0)
IF lnHandle < 0
? "Unable to Open file + '" + tcExeDllName + "'. Error:" + FERROR()
RETURN lcVersion
ENDIF
* Read first 64KB
lcBuffer = FREAD(lnHandle, 65535)
=FCLOSE(lnHandle)
* Check for regular runtime signature
lnPos = AT(lcSig, lcBuffer)
IF lnPos > 0
*lcVersion = "Vfp " + STRTRAN(SUBSTR(lcBuffer, lnPos + LEN(lcSig),2), CHR(0), "") + ".0"
lcVersion = "Vfp" + STRTRAN(SUBSTR(lcBuffer, lnPos + LEN(lcSig),2), CHR(0), "") + "R.dll"
ELSE
* Check for Multithreaded (MT) runtime signature
lnPos = AT(lcSigMT, lcBuffer)
IF lnPos > 0
*lcVersion = "Vfp MT " + STRTRAN(SUBSTR(lcBuffer, lnPos + LEN(lcSigMT),2), CHR(0), "") + ".0"
lcVersion = "Vfp" + STRTRAN(SUBSTR(lcBuffer, lnPos + LEN(lcSigMT),2), CHR(0), "") + "T.dll"
ENDIF
ENDIF
RETURN lcVersion
|
Comments