注册 登录
编程论坛 VFP论坛

VFP9 combox 的BUG,CCB2000在VFP10中已修复。谁有简单的绕过这个BUG的方法?

kangss 发布于 2025-04-03 17:35, 2348 次点击
CCB2000在VFP10中剖析修复:https://

复现BUG例子:
只有本站会员才能查看附件,请 登录


BUG演示:
只有本站会员才能查看附件,请 登录


这个例子是简单的把dbf挂接到combox上

测试过程:点击小三角展开
滚动条拉到底,选择点击最后一个
滚动条拉到头,再选择点击第一个
反反复复,多试几次,有时候第一次第二次就会出现BUG

当点击list项目后,combox的值没有发生改变,BUG就呈现出来了,此时点击窗口,combox的值又更新了。
看看谁有简单有效绕过这个BUG的方法?
71 回复
#52
VFPRafer2025-04-09 12:42
PROCEDURE prdCombobox_Inpt_Atcyen
    PARAMETERS m.cWdgtLtr,m.nCyen,m.lLine

    .ColumnCount=5
    .ColumnLines=0
    .ColumnWidths=[60,80,60,60,30]
    .DisabledItemForeColor=255
    .AddListItem('\]'+fncTran([English desc]))
    .AddListItem('\]'+fncTran([Chinese desc]),.NewItemID,2)
    .AddListItem('\]'+fncTran([Currency sort]),.NewItemID,3)
    .AddListItem('\]'+fncTran([Currency no.]),.NewItemID,4)
    .AddListItem('\]'+fncTran([No.]),.NewItemID,5)
    .AddListItem([\-])
    .AddListItem(SPACE(0))
    IF    SqlExec(_Screen.RmtHdl,[select cAtcy_no,cAtcy_en,cAtcy_cn,cSort_cy from x_Atcy order by cAtcy_en],[x_Tdx])=1
        DO prdES WITH [Pub_setCodeword],ALIAS()
        SCAN FOR fncTran([This currency])$x_Tdx.cSort_cy=.T.
            DO prdCombobox_Inpt_Atcyen_Act WITH ALLTRIM(x_Tdx.cSort_cy)
        ENDSCAN
        IF    m.lLine=.T.
            .AddListItem([\-])
        ENDIF
        m.lLine=.F.
        SCAN FOR fncTran([Often])$x_Tdx.cSort_cy=.T. AND fncTran([This currency])$x_Tdx.cSort_cy=.F.
            DO prdCombobox_Inpt_Atcyen_Act WITH ALLTRIM(x_Tdx.cSort_cy)
        ENDSCAN
        IF    m.lLine=.T.
            .AddListItem([\-])
        ENDIF
        DELETE FOR fncTran([This currency])$x_Tdx.cSort_cy=.T. OR fncTran([Often])$x_Tdx.cSort_cy=.T.
        SELECT DISTINCT LEFT(x_Tdx.cAtcy_en,1) AS cLr FROM x_Tdx INTO CURSOR x_Tdy
        SCAN
            SELECT x_Tdx
            m.nLr=1
            SCAN FOR LEFT(x_Tdx.cAtcy_en,1)==x_Tdy.cLr
                DO prdCombobox_Inpt_Atcyen_Act WITH IIF(EMPTY(x_Tdx.cSort_cy)=.F.,ALLTRIM(x_Tdx.cSort_cy),LOWER(x_Tdy.cLr)+LTRIM(STR(m.nLr)))
                m.nLr=m.nLr+1
            ENDSCAN
            IF    RECNO([x_Tdy])!=RECCOUNT([x_Tdy])
                .AddListItem([\-])
            ENDIF
        ENDSCAN
        USE IN x_Tdx
    ENDIF
    .AddListItem(SPACE(0))
    .AddListItem([\-])
    .AddListItem('\]'+.List[1,1])
    .AddListItem('\]'+.List[1,2],.NewItemID,2)
    .AddListItem('\]'+.List[1,3],.NewItemID,3)
    .AddListItem('\]'+.List[1,4],.NewItemID,4)
    .AddListItem('\]'+.List[1,5],.NewItemID,5)
    .DefaultValue=.List[3]
ENDPROC
#53
VFPRafer2025-04-09 12:44
只有本站会员才能查看附件,请 登录
#54
easyppt2025-04-09 13:38
kangss 老师厉害了, ccb2000 竟然现身了  

#55
csyx2025-04-09 14:02
以下是引用VFPRafer在2025-4-9 12:41:25的发言:
我用的这个版本,没点问题

你这是用的第三方 ActiveX 吧
#56
ccb20002025-04-09 15:54
回复 50楼 csyx
> 初步确定 vfp9.exe(5815) 的修改位置是 0x4c7421(0x4c7420+1),只是不知这个 e9 6f 00 的 6f 是否适用于 5815 (简单测试了一下好像没问题)
> vfp9r.dll(5815) 修改位置是 0x3bdecf(0x3bdece+1)
修改位置,修改代码e9 6f 00 00 00正确。
vfp9t.dll(5815) 修改位置是 0x2F2E03+1,修改代码e9 6f 00 00 00。

#57
csyx2025-04-09 16:11
以下是引用ccb2000在2025-4-9 15:54:06的发言:

> 初步确定 vfp9.exe(5815) 的修改位置是 0x4c7421(0x4c7420+1),只是不知这个 e9 6f 00 的 6f 是否适用于 5815 (简单测试了一下好像没问题)
> vfp9r.dll(5815) 修改位置是 0x3bdecf(0x3bdece+1)
修改位置,修改代码e9 6f 00 00 00正确。
vfp9t.dll(5815) 修改位置是 0x2F2E03+1,修改代码e9 6f 00 00 00。

多谢确认,更感谢您提供的修改方法

#58
cssnet2025-04-09 16:29
以下是引用csyx在2025-4-9 16:11:26的发言:

多谢确认,更感谢您提供的修改方法


嘿,咱哥俩好像用的同一版本5815。谁来当小白鼠?要不要先猜个拳?——我出包,你出锤子?若是管用,吱一声?
#59
cssnet2025-04-09 16:45
以下是引用ccb2000在2025-4-9 15:54:06的发言:

> 初步确定 vfp9.exe(5815) 的修改位置是 0x4c7421(0x4c7420+1),只是不知这个 e9 6f 00 的 6f 是否适用于 5815 (简单测试了一下好像没问题)
> vfp9r.dll(5815) 修改位置是 0x3bdecf(0x3bdece+1)
修改位置,修改代码e9 6f 00 00 00正确。
vfp9t.dll(5815) 修改位置是 0x2F2E03+1,修改代码e9 6f 00 00 00。


非常感谢ccb2000的指导!

现在唯一的犹豫就是:只要一改,哪怕只五个字节,微软的数字签名便立即失效;倘若真对外发布缺失了微软数字签名的vfp9r.dll,不知会不会有版权方面的问题;且,面对客户,似乎也存在无法交代清楚的疑虑……唉,真是愁银!
#60
csyx2025-04-09 16:48
以下是引用cssnet在2025-4-9 16:29:00的发言:
嘿,咱哥俩好像用的同一版本5815。谁来当小白鼠?要不要先猜个拳?——我出包,你出锤子?若是管用,吱一声?

不用了吧,陈先生已在56楼确认5815的位置正确,修复后的执行状况应该与vfpa的相同,而vfpa已经国内外用户检验过,现在应用当不算小白鼠了
简单测试了几次,管用。
还有点点遗憾,我们的安装程序使用的运行库是 msm,想要咱自己修复它有点困难,有空得找找 msm 是否能解包更新

#61
csyx2025-04-09 16:53
以下是引用cssnet在2025-4-9 16:45:35的发言:
现在唯一的犹豫就是:只要一改,哪怕只五个字节,微软的数字签名便立即失效

右击运行库属性里好像没看到有数字签名啊,随便另找一个是有的
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2025-4-9 16:57编辑过]

#62
easyppt2025-04-09 17:06
CCB2000 老师,CA更新时 ?字段名  也存在BUG,我映像中这个好像你也修复了,不知道VFP9-7423 版本 中能否也帮忙修复一下。
因为VFP9用的最多的就是 CA对象了,所以这个BUG太糟糕了

#63
VFPRafer2025-04-09 17:12
回复 55楼 csyx
没有,就用原生态VFP的Combobox
#64
csyx2025-04-09 17:34
以下是引用VFPRafer在2025-4-9 12:42:36的发言:
    .AddListItem('\]'+.List[1,5],.NewItemID,5)
    .DefaultValue=.List[3]
ENDPROC

以下是引用VFPRafer在2025-4-9 17:12:32的发言:
没有,就用原生态VFP的Combobox

#65
kangss2025-04-09 20:00
以下是引用csyx在2025-4-9 16:48:26的发言:


不用了吧,陈先生已在56楼确认5815的位置正确,修复后的执行状况应该与vfpa的相同,而vfpa已经国内外用户检验过,现在应用当不算小白鼠了
简单测试了几次,管用。
还有点点遗憾,我们的安装程序使用的运行库是 msm,想要咱自己修复它有点困难,有空得找找 msm 是否能解包更新

今天一直在测试,也是没空搞 msm,百度到 Orca 可以编辑MSI和MSM,替换里面的文件。
http://www.
明天再测试这个工具是否能修改msm
#66
csyx2025-04-10 15:39
以下是引用kangss在2025-4-9 20:00:52的发言:
百度到 Orca 可以编辑MSI和MSM,替换里面的文件。

多谢,下载了一个,安装后能打开 msm,在 files 段能看到 runtime dll,就是没找到替换的方法

#67
kangss2025-04-10 16:32
以下是引用csyx在2025-4-10 15:39:07的发言:
多谢,下载了一个,安装后能打开 msm,在 files 段能看到 runtime dll,就是没找到替换的方法

上午测试了,它把msm当成dbf处理了,确实可以brow、delete,但是没用,下午测试完 InstallShield。

下载 InstallShield,推荐 2010 版,这个版本非常经典

从sp1、sp2升级包中取出“Vfp9Runtime.msm”放到单独的文件夹中,双击,InstallShield 可以直接打开它

在 compenents 删除 vfp9r.dll、和vfp9t.dll

在 files and folders 中,添加 2 个新的 dll(鼠标右键添加,或者直接拽进来)。注意:这2个新的dll,建议使用 exescope.exe 修改一下版本。比如:把 9.0.0.7423 改成 9.0.1.7423,这样安装时会高版本会覆盖低版本

然后,再到 compenents 项目找到 vfp9r.dll、和vfp9t.dll,修改安装路径,如果不想修改,之前的3个文件夹是默认安装到 C:\Program Files (x86)\Common Files\microsoft shared\VFP

最后保存项目,它会自动编译成一个新的 Vfp9Runtime.msm。编译的新msm,比之前的大,看样子它应该是没有把2个dll压缩。
#68
joinwin_ling2025-04-12 16:35
感谢前辈的付出!给foxer们造福了
#69
wxzd1232025-04-17 14:56
以下是引用ccb2000在2025-4-9 09:31:32的发言:

可以运行以下代码修复VFP 9.0.0.7423 (SP2)中的这个bug:

SET TALK OFF

x1=FILETOSTR("vfp9.exe")
IF SUBS(x1,0x4c7570+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x4c7570+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9.exe")
ENDI

x1=FILETOSTR("vfp9r.dll")
IF SUBS(x1,0x3bdf3e+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x3bdf3e+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9r.dll")
ENDI

x1=FILETOSTR("vfp9t.dll")
IF SUBS(x1,0x2f2e43+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x2f2e43+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"vfp9t.dll")
ENDI

也可以下载VFP Advanced 2022免费版。
请教各位老师,我运行后vfp9t.dll被修改,而vfp9t.dll没有修改?
#70
csyx2025-04-17 15:26
以下是引用wxzd123在2025-4-17 14:56:32的发言:
我运行后vfp9t.dll被修改,而vfp9t.dll没有修改?

幼儿园大班学历的我表示没怎么看懂
#71
kangss2025-04-17 19:59
以下是引用wxzd123在2025-4-17 14:56:32的发言:

请教各位老师,我运行后vfp9t.dll被修改,而vfp9t.dll没有修改?


你可以这样试试:
x1=FILETOSTR("c:\vfp9.exe")
IF SUBS(x1,0x4c7570+1,5)=CHR(0xba)+CHR(0x01)+CHR(0x00)+CHR(0x00)+CHR(0x00)
   x1=STUFF(x1,0x4c7570+1,5,CHR(0xe9)+CHR(0x6f)+CHR(0x00)+CHR(0x00)+CHR(0x00))
   =STRTOFILE(x1,"c:\vfp9_1.exe")
ENDI

除非你的版本号不是7.423。鼠标右键,看看你的dll版本号是多少。
#72
wxzd1232025-04-18 05:58
回复 71楼 kangss
谢谢老师
12