------------------------------------------------------------
[BUG/PRB.] VFP 9.0 FIX - FILE HANDLE NUMBER ZERO
January 2026
------------------------------------------------------------
CCB
1. BUG:
In vfp9 (and vfp6, vfp7, vfp8), sometimes the function FOPEN() will return file handle number zero.
There is some message from Mr. Ken:
In both VFP 8 and VFP 9, it is possible that the function
FOPEN(filename, 1)
will return handle number zero. When this happens, the function
FSEEK(handle, 0, 2)
appears to not work -- it always returns zero.
There is a program for test:
*PROC testfilehandlenumberzero
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
=STRTOFILE("123456789","testfilehandlenumberzero.txt")
* close the task manager file (foxtask.dbf).
_FOXTASK=""
PRIVATE m.q_hand
m.q_hand=FOPEN("testfilehandlenumberzero.txt",0)
?"filehandlenumber: "+LTRIM(STR(m.q_hand,16))
WAIT
PRIVATE m.q_seek
m.q_seek=FSEEK(m.q_hand,5,0)
?"FSEEK(m.q_hand,5,0): "+LTRIM(STR(m.q_seek,16))
IF m.q_seek=5
?"FSEEK() OK."
ELSE
?"FSEEK() ERROR!"
ENDI
WAIT
?"FREAD(m.q_hand,1): "+FREAD(m.q_hand,1)
?"FREAD(m.q_hand,1): "+FREAD(m.q_hand,1)
?"FREAD(m.q_hand,1): "+FREAD(m.q_hand,1)
WAIT
PRIVATE m.q_seek2
m.q_seek2=FSEEK(m.q_hand,0,1)
?"FSEEK(m.q_hand,0,1): "+LTRIM(STR(m.q_seek2,16))
IF m.q_seek2=8
?"FSEEK() OK."
ELSE
?"FSEEK() ERROR!"
ENDI
WAIT
=FCLOSE(m.q_hand)
CLOSE DATABASES ALL
CLOSE TABLES ALL
RETURN
* END OF PROC TESTFILEHANDLENUMBERZERO.
We can create a configuration file config.fpw:
RESOURCE=OFF
that is vfp will not open the resource file (foxuser.dbf).
then we can start vfp9:
VFP9.EXE -Cconfig.fpw
then we can run the following statement in the Command window:
DO testfilehandlenumberzero.prg
Usually, the function FSEEK() will return zero.
2. CAUSE:
There are some BUGs in the following code.
3. RESOLUTION:
We can write some code to fix the BUG.
Label8e63f4 ::
test edi , edi ;0x008e63f4 : 85ff
;
; -------------------------------------------------
; VFP 9.0 FIX - FILE HANDLE NUMBER ZERO
; August 2015
; -------------------------------------------------
; CCB
;
; For the file handle number 0, sometimes VFP will process it same as the file handle number -1.
;
; 2015/8/12, by ccb
;
; jle Label8e640c ;0x008e63f6 : 7e14
jl Label8e640c ;0x008e63f6 : 7e14
mov eax , dword ptr [ Data93757c ] ;0x008e63f8 : a17c759300
imul edi , edi , 038h ;0x008e63fd : 6bff38
mov ecx , dword ptr [ edi + eax + 4 ] ;0x008e6400 : 8b4c0704
mov eax , dword ptr [ ebp - 12 ] ;0x008e6404 : 8b45f4
mov dword ptr [ eax + 12 ] , ecx ;0x008e6407 : 89480c
jmp Label8e6413 ;0x008e640a : eb07
Label8e640c ::
mov eax , dword ptr [ ebp - 12 ] ;0x008e640c : 8b45f4
and dword ptr [ eax + 12 ] , 00h ;0x008e640f : 83600c00
Label8e6413 ::
mov byte ptr [eax] , 049h ;0x008e6413 : c60049
mov dword ptr [ eax + 4 ] , 0Ah ;0x008e6416 : c740040a000000
Label8e641d ::
pop edi ;0x008e641d : 5f
pop esi ;0x008e641e : 5e
pop ebx ;0x008e641f : 5b
leave ;0x008e6420 : c9
ret ;0x008e6421 : c3
Now in VFP Advanced, the function FSEEK() can run fine even the file handle number is zero.
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.
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
2, microsoft.com:
https://social.msdn.microsoft.com/Forums/en-US/cf6429ff-eb67-436e-ad39-441a60b62033/problems-with-fseek
3, tek-tips.com:
http://www.tek-tips.com/viewthread.cfm?qid=292708
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|