以下是引用csyx在2025-10-22 16:09:05的发言:
这句:DO WHILE SYS(2600,p,1) != 0h00
改成:DO WHILE !(SYS(2600,p,1) == 0h00)
用改后循环在一台xp上运行了30次,只遇到一次提取失败
在自己本本VM虚拟机上安装个xp,用改后循环运行100次,无失败
两台机的 set('exact') 默认设置均为 ON
应该与XP关系不大。
可能是SYS(2600)抛出的异常,用指针操作要谨慎。
不清楚vfp调用API按“@字符串”作为字符串in/out参数的内部处理方法是怎样,每次调用“@字符串”后这个“字符串”的内存分配应该是变动的。
或者可以这样试试看还会不会出错:每次获取字符串指针都要重新定义字符串buffer
buffer = REPLICATE(0h00,256)
p
= strcpy(@buffer, arr[i])
最好的方法应该是先分配一块堆内存块作为字符串buffer,这样得到的buffer指针是固定不变的。
执行 SYS(2600) 前也可以先调用相关api检测:
IsBadCodePtr()
IsBadReadPtr()
IsBadWritePtr()
IsBadStringPtrA()