--------------------------------------------------------------
                      [BUG/PRB.] VFP 9.0 FIX - PROPERTY NAMES TO LOWERCASE
                                 January 2024
                 --------------------------------------------------------------
                                    CCB



1. BUG:

     In vfp9 (and vfp6, vfp7, vfp8), we can build the COM server programs, and it can embedd the Type Library resource data,
     then other languages such as VC, VC# and VB can access the object's members (properties and methods).

     In VFP language, we can use the names (variable names, field names, property names, etc.) with case insensitive,
     for example, the name ABC is the same as the name abc.
     In other languages such as VC, VC# and VB, we use the names with case sensitive,
     for example, the name ABC is not the same as the name abc, they are two different names.

     There are some problems about uppercase and lowercase for the property names and method names in the visual class library file.
     When we build the COM server project,
     sometimes the property names (and method names) will be converted to uppercase,
     sometimes the property names (and method names) will be converted to lowercase,
     this is random.

     The bug was reported by David Acuna.


2. CAUSE:

     In VFP, when we create a new name (variable name, field name, property name, etc.),
     VFP will add the name to the Name Table Index (NTI).
     
     Usually, VFP will convert the name (variable name, field name) to uppercase and then add the name to the Name Table Index (NTI),
     but for the property name (and method name) in the visual class library file,
     VFP will not convert the name (so it is a lowercase name) and then add the name to the Name Table Index (NTI).

     So, if there is a variable name (or field name) same as the property name (or method name), there are some problems.

     For example,
     there is a property name abc,
     and there is a variable name abc.

     Usually, If we don't use the variable name (or field name) abc,
     when we build the COM server project,
     the property name abc will not be converted,
     the property name is a lowercase name (abc).

     If we use the variable name abc first,
     VFP will convert the variable name abc to uppercase (ABC) and then add the name to the Name Table Index (NTI),
     and then we can build the COM server project,
     the property name abc will use the variable name (ABC) in the Name Table Index (NTI),
     so the property name is a uppercase name (ABC).

     So, sometimes we get the lowercase property name (abc),
     but sometimes we get the uppercase property name (ABC).
     In VFP, there is no problem, because VFP is case insensitive,
     but in other languages such as VC, VC# and VB, this is a problem, because they are case sensitive.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Label4fb0d9 ::
             lea eax ,  dword ptr [ ebp + 47 ]                               ;0x004fb0d9 :        8d452f
             push eax                                                        ;0x004fb0dc :        50
             lea eax ,  dword ptr [ ebp + 16 ]                               ;0x004fb0dd :        8d4510
             push eax                                                        ;0x004fb0e0 :        50
             lea eax ,  dword ptr [ ebp + 47 ]                               ;0x004fb0e1 :        8d452f
             push eax                                                        ;0x004fb0e4 :        50
             lea eax ,  dword ptr [ ebp + 4 ]                                ;0x004fb0e5 :        8d4504
             push eax                                                        ;0x004fb0e8 :        50
             lea eax ,  dword ptr [ ebp + 47 ]                               ;0x004fb0e9 :        8d452f
             push eax                                                        ;0x004fb0ec :        50
             lea eax ,  dword ptr [ ebp + 48 ]                               ;0x004fb0ed :        8d4530
             push eax                                                        ;0x004fb0f0 :        50
             lea eax ,  dword ptr [ esi + 1 ]                                ;0x004fb0f1 :        8d4601
             pushd offset Data92119c                                                  ;0x004fb0f4 :        689c119200
             push eax                                                        ;0x004fb0f9 :        50
             call  sscanf                                      ;0x004fb0fa :        ff1530799100
             add esp , 024h                                                  ;0x004fb100 :        83c424


     ;
     ;                 ---------------------------------------------------------
     ;                      VFP 9.0 FIX - PROPERTY ARRAY NAMES TO LOWERCASE
     ;                                February 2016
     ;                 ---------------------------------------------------------
     ;                                     CCB
     ;
     ; Convert the property array names in the visual class library file to lowercase.
     ;
     ; 2016/2/24, by ccb
     ;

             lea eax ,  dword ptr [ ebp + 48 ]
             push eax
             call lstrlenA
             push eax
             lea eax ,  dword ptr [ ebp + 48 ]
             push eax
             call CharLowerBuffA
     ;         mov dword ptr vfpa_ntinametolower_tolower,01h
             pushd 01h                                                       ;0x004fb103 :        6a01
             lea eax ,  dword ptr [ ebp + 48 ]                               ;0x004fb105 :        8d4530
             push eax                                                        ;0x004fb108 :        50
             call Fun432788                                                  ;0x004fb109 :        e87a76f3ff
     Label4fb10d ::
     ;         mov dword ptr vfpa_ntinametolower_tolower,00h


     Label4fb10e ::
             pushd 0Bh                                                       ;0x004fb10e :        6a0b
             mov  dword ptr [ ebp + 36 ] , eax                               ;0x004fb110 :        894524
             pop ecx                                                         ;0x004fb113 :        59
             xor eax , eax                                                   ;0x004fb114 :        33c0
             push eax                                                        ;0x004fb116 :        50
             push  dword ptr [ ebp + 36 ]                                    ;0x004fb117 :        ff7524
             lea edi ,  dword ptr [ ebp - 56 ]                               ;0x004fb11a :        8d7dc8
             rep stosd                                                       ;0x004fb11d :        f3ab
             mov ax , 080h                                                   ;0x004fb11f :        66b88000
             mov  byte ptr [ ebp - 56 ] , 04Ch                               ;0x004fb123 :        c645c84c
             call Fun512fff                                                  ;0x004fb127 :        e8d37e0100
             test eax , eax                                                  ;0x004fb12c :        85c0
             jne Label4fb174                                                 ;0x004fb12e :        7544
             mov  eax , dword ptr [ ebp + 0240h ]                            ;0x004fb130 :        8b8540020000
             cmp  dword ptr [eax] , 02h                                      ;0x004fb136 :        833802
             pushd 00h                                                       ;0x004fb139 :        6a00
             je Label4f53c6                                                  ;0x004fb13b :        0f8485a2ffff
             lea eax ,  dword ptr [ ebp - 56 ]                               ;0x004fb141 :        8d45c8
             push eax                                                        ;0x004fb144 :        50
             push  dword ptr [ ebp + 16 ]                                    ;0x004fb145 :        ff7510
             mov esi , ebx                                                   ;0x004fb148 :        8bf3
             push  dword ptr [ ebp + 4 ]                                     ;0x004fb14a :        ff7504
             push  dword ptr [ ebp + 36 ]                                    ;0x004fb14d :        ff7524
             call Fun4bd0e0                                                  ;0x004fb150 :        e88b1ffcff
             mov  ecx , dword ptr [ Data9388dc ]                             ;0x004fb155 :        8b0ddc889300
             mov edx , eax                                                   ;0x004fb15b :        8bd0
             lea eax ,  dword ptr [ ebx + 4 * ebx ]                          ;0x004fb15d :        8d049b
             shl eax , 05h                                                   ;0x004fb160 :        c1e005
             test  byte ptr [ eax + ecx + 48 ] , 02h                         ;0x004fb163 :        f644083002
             mov  dword ptr [ ebp + 40 ] , edx                               ;0x004fb168 :        895528
             jne Label5dfa2b                                                 ;0x004fb16b :        0f85ba480e00

     Label4fb171 ::
             mov  esi , dword ptr [ ebp + 8 ]                                ;0x004fb171 :        8b7508

     Label4fb174 ::
             cmp  byte ptr [ ebp + 0130h ] , 00h                             ;0x004fb174 :        80bd3001000000
             jne Label4f4b8e                                                 ;0x004fb17b :        0f850d9affff

     Label4fb181 ::
             mov  eax , dword ptr [ ebp + 28 ]                               ;0x004fb181 :        8b451c
             add  dword ptr [ ebp + 32 ] , eax                               ;0x004fb184 :        014520
             mov  ecx , dword ptr [ ebp + 12 ]                               ;0x004fb187 :        8b4d0c
             push  dword ptr [ ebp + 32 ]                                    ;0x004fb18a :        ff7520
             mov edx , ecx                                                   ;0x004fb18d :        8bd1
             shr ecx , 02h                                                   ;0x004fb18f :        c1e902
             xor eax , eax                                                   ;0x004fb192 :        33c0
             mov edi , esi                                                   ;0x004fb194 :        8bfe
             rep stosd                                                       ;0x004fb196 :        f3ab
             mov ecx , edx                                                   ;0x004fb198 :        8bca
             and ecx , 03h                                                   ;0x004fb19a :        83e103
             mov edx , esi                                                   ;0x004fb19d :        8bd6
             rep stosb                                                       ;0x004fb19f :        f3aa
             call Fun4fb090                                                  ;0x004fb1a1 :        e8eafeffff
             test eax , eax                                                  ;0x004fb1a6 :        85c0
             mov  dword ptr [ ebp + 28 ] , eax                               ;0x004fb1a8 :        89451c
             je Label4fa6a5                                                  ;0x004fb1ab :        0f84f4f4ffff

     Label4fb1b1 ::
             or  dword ptr [ ebp + 40 ] , 0FFFFFFFFh                         ;0x004fb1b1 :        834d28ff
             mov  byte ptr [ ebp + 0130h ] , 00h                             ;0x004fb1b5 :        c6853001000000
             mov  al , byte ptr [esi]                                        ;0x004fb1bc :        8a06
             cmp al , 02Ah                                                   ;0x004fb1be :        3c2a
             je Label4fb233                                                  ;0x004fb1c0 :        7471
             cmp al , 05Eh                                                   ;0x004fb1c2 :        3c5e
             lea eax ,  dword ptr [ ebp + 0130h ]                            ;0x004fb1c4 :        8d8530010000
             push eax                                                        ;0x004fb1ca :        50
             je Label4fb0d9                                                  ;0x004fb1cb :        0f8408ffffff
             lea eax ,  dword ptr [ ebp + 48 ]                               ;0x004fb1d1 :        8d4530
             push eax                                                        ;0x004fb1d4 :        50
             pushd offset Data921d40                                                  ;0x004fb1d5 :        68401d9200
             push esi                                                        ;0x004fb1da :        56
             call  sscanf                                      ;0x004fb1db :        ff1530799100
             add esp , 010h                                                  ;0x004fb1e1 :        83c410


     ;
     ;                 ---------------------------------------------------
     ;                      VFP 9.0 FIX - PROPERTY NAMES TO LOWERCASE
     ;                                February 2016
     ;                 ---------------------------------------------------
     ;                                     CCB
     ;
     ; Convert the property names in the visual class library file to lowercase.
     ;
     ; 2016/2/24, by ccb
     ;

             lea eax ,  dword ptr [ ebp + 48 ]
             push eax
             call lstrlenA
             push eax
             lea eax ,  dword ptr [ ebp + 48 ]
             push eax
             call CharLowerBuffA
     ;         mov dword ptr vfpa_ntinametolower_tolower2,01h
             pushd 01h                                                       ;0x004fb1e4 :        6a01
             lea eax ,  dword ptr [ ebp + 48 ]                               ;0x004fb1e6 :        8d4530
             push eax                                                        ;0x004fb1e9 :        50
             call Fun432788                                                  ;0x004fb1ea :        e89975f3ff
     Label4fb1ee ::
     ;         mov dword ptr vfpa_ntinametolower_tolower2,00h


     Label4fb1ef ::
             pushd 0Bh                                                       ;0x004fb1ef :        6a0b
             mov  dword ptr [ ebp + 36 ] , eax                               ;0x004fb1f1 :        894524
             pop ecx                                                         ;0x004fb1f4 :        59
             xor eax , eax                                                   ;0x004fb1f5 :        33c0
             push eax                                                        ;0x004fb1f7 :        50
             push  dword ptr [ ebp + 36 ]                                    ;0x004fb1f8 :        ff7524
             lea edi ,  dword ptr [ ebp - 56 ]                               ;0x004fb1fb :        8d7dc8
             rep stosd                                                       ;0x004fb1fe :        f3ab
             mov ax , 04h                                                    ;0x004fb200 :        66b80400
             mov  byte ptr [ ebp - 56 ] , 04Ch                               ;0x004fb204 :        c645c84c
             call Fun512fff                                                  ;0x004fb208 :        e8f27d0100
             test eax , eax                                                  ;0x004fb20d :        85c0
             jne Label4fb174                                                 ;0x004fb20f :        0f855fffffff
             push eax                                                        ;0x004fb215 :        50
             pushd 02Ch                                                      ;0x004fb216 :        6a2c
             lea eax ,  dword ptr [ ebp - 56 ]                               ;0x004fb218 :        8d45c8
             push eax                                                        ;0x004fb21b :        50
             pushd 02h                                                       ;0x004fb21c :        6a02
             pushd 058h                                                      ;0x004fb21e :        6a58
             pushd 04h                                                       ;0x004fb220 :        6a04
             push  dword ptr [ ebp + 36 ]                                    ;0x004fb222 :        ff7524
             push ebx                                                        ;0x004fb225 :        53
             call Fun418a4b                                                  ;0x004fb226 :        e820d8f1ff

     Label4fb22b ::
             mov  dword ptr [ ebp + 40 ] , eax                               ;0x004fb22b :        894528
             jmp Label4fb174                                                 ;0x004fb22e :        e941ffffff

     Label4fb233 ::
             lea eax ,  dword ptr [ ebp + 0130h ]                            ;0x004fb233 :        8d8530010000
             push eax                                                        ;0x004fb239 :        50
             lea eax ,  dword ptr [ ebp + 48 ]                               ;0x004fb23a :        8d4530
             push eax                                                        ;0x004fb23d :        50
             lea eax ,  dword ptr [ esi + 1 ]                                ;0x004fb23e :        8d4601
             pushd offset Data921d4c                                                  ;0x004fb241 :        684c1d9200
             push eax                                                        ;0x004fb246 :        50
             call  sscanf                                      ;0x004fb247 :        ff1530799100
             add esp , 010h                                                  ;0x004fb24d :        83c410


     ;
     ;                 -------------------------------------------------
     ;                      VFP 9.0 FIX - METHOD NAMES TO LOWERCASE
     ;                                February 2016
     ;                 -------------------------------------------------
     ;                                     CCB
     ;
     ; Convert the method names in the visual class library file to lowercase.
     ;
     ; 2016/2/24, by ccb
     ;

             lea eax ,  dword ptr [ ebp + 48 ]
             push eax
             call lstrlenA
             push eax
             lea eax ,  dword ptr [ ebp + 48 ]
             push eax
             call CharLowerBuffA
     ;         mov dword ptr vfpa_ntinametolower_tolower3,01h
             pushd 01h                                                       ;0x004fb250 :        6a01
             lea eax ,  dword ptr [ ebp + 48 ]                               ;0x004fb252 :        8d4530
             push eax                                                        ;0x004fb255 :        50
             call Fun432788                                                  ;0x004fb256 :        e82d75f3ff
     Label4fb25a ::
     ;         mov dword ptr vfpa_ntinametolower_tolower3,00h


     Label4fb25b ::
             mov edi , eax                                                   ;0x004fb25b :        8bf8
             pushd 00h                                                       ;0x004fb25d :        6a00
             push edi                                                        ;0x004fb25f :        57
             mov ax , 010h                                                   ;0x004fb260 :        66b81000
             call Fun512fff                                                  ;0x004fb264 :        e8967d0100
             test eax , eax                                                  ;0x004fb269 :        85c0
             jne Label4fb174                                                 ;0x004fb26b :        0f8503ffffff
             pushd 010h                                                      ;0x004fb271 :        6a10
             push edi                                                        ;0x004fb273 :        57
             push ebx                                                        ;0x004fb274 :        53
             xor ecx , ecx                                                   ;0x004fb275 :        33c9
             call Fun4fb02d                                                  ;0x004fb277 :        e8b1fdffff
             jmp Label4fb22b                                                 ;0x004fb27c :        ebad

     Now VFP will ALWAYS convert the property names and method names in the visual class library file to lowercase
     and then add the names to the Name Table Index (NTI).


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
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix265.asp
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix266.asp

     2, msdn.com:
     http://blogs.msdn.com/b/calvin_hsia/archive/2005/09/02/460206.aspx

     3, foxpert.com:
     http://www.foxpert.com/docs/howfoxproworks.en.htm

     4, codemag.com:
     http://www.codemag.com/article/050014


6. OTHER:

     For reference only, there is no guarantees.

     Any questions or suggestions, please send me an email at ccb2000@163.com.