精易论坛

标题: 精易模块bug反馈,函数:图片_屏幕区域截图 [打印本页]

作者: 逆神者一方    时间: 2024-9-5 12:06
标题: 精易模块bug反馈,函数:图片_屏幕区域截图
本帖最后由 逆神者一方 于 2024-9-5 12:08 编辑

精易模块函数:图片_屏幕区域截图 模块版本:11.1.5,虽不是最新版本,但看后续并没有修改这个函数,bug应该还存在,这个会造成低概率数组越界导致程序崩溃!说是低概率实际应该是截取小区域导致字节集过少,而模块内部使用了数组方式获取字节集的位置造成的,经测试,报错时字节集的长度出现过32和40,报错代码行:

》 如果 (GetDIBits2 (目标场景, 位图句柄, 0, 欲截取的高度, Data [BitmapHead.biSize + 1], Data [1], 0) ≠ 0)

其中的Data [BitmapHead.biSize + 1]报错,数组越界,应该加个判断如下:

》size = 取字节集长度 (Data)
》if (size ≥ BitmapHead.biSize + 1){
》   如果 (GetDIBits2 (目标场景, 位图句柄, 0, 欲截取的高度, Data [BitmapHead.biSize + 1], Data [1], 0) ≠ 0)
》   ....
》}else if(size > 0){
》   如果 (GetDIBits2 (目标场景, 位图句柄, 0, 欲截取的高度, Data [size], Data [1], 0) ≠ 0)
》   ....
》}else{
》   Data = {  }
》}

写的这个代码仅用作参考,我并不清楚Data [BitmapHead.biSize + 1]的作用就写了Data [size],不过写之后再没有报错了

作者: Suky    时间: 2024-9-5 12:12
11.1.5就是最新版
作者: 逆神者一方    时间: 2024-9-5 12:14
Suky 发表于 2024-9-5 12:12
11.1.5就是最新版

11.1.8版本不是已经发了么,心疼精币就没有下
作者: Suky    时间: 2024-9-5 12:20
逆神者一方 发表于 2024-9-5 12:14
11.1.8版本不是已经发了么,心疼精币就没有下

别多想,那是个人更新的,精易这边只更新到11.1.5
后面的那不是论坛官方做的
作者: 逆神者一方    时间: 2024-9-5 14:49
感谢榜一大哥的打赏
作者: 赵刚    时间: 2024-9-6 07:43
11.1.5就是最新版
作者: 梦寻简单    时间: 2024-9-8 14:54
逐行分析一下:
【GetDIBits2 (目标场景, 位图句柄, 0, 欲截取的高度, Data [BitmapHead.biSize + 1], Data [1], 0) ≠ 0】,这里下标越界的情况是Data的长度小于BitmapHead.biSize + 1,后面的Data[1]先不用考虑。前面越界了后面的肯定是越界了的。
【Data = 取空白字节集 (BitmapHead.biSize + 行宽 × 欲截取的高度)】,data的长度来源于这,BitmapHead.biSize值固定为40,结合前一行,要想不越界,只需要【行宽 × 欲截取的高度】的值大于0,
【行宽 = 左移 (右移 (欲截取的宽度 × 色深 + 31, 5), 2)】行宽来源于这。
【色深 = GetDeviceCaps (源场景, 12)】,色深来源于这。

色深出现0的概率。。。

所以,多检查一下这个【欲截取的宽度】和【欲截取的高度】这两个变量的值。


作者: 逆神者一方    时间: 2024-9-8 19:57
本帖最后由 逆神者一方 于 2024-9-8 20:11 编辑
梦寻简单 发表于 2024-9-8 14:54
逐行分析一下:
【GetDIBits2 (目标场景, 位图句柄, 0, 欲截取的高度, Data , Data [1], 0) ≠ 0】,这里下 ...

经过几轮测试下来,发现以下data长度会报错:
当Data长度等于以下值时,数组越界:

    ' Data长度=40 | 欲截取的高度=0 | 行宽=4 | 欲截取的宽度=1 | 色深=32
    ' Data长度=36 | 欲截取的高度=1 | 行宽=-4 |  | 色深=32
    ' Data长度=32 | 欲截取的高度=1 | 行宽=-8 | 欲截取的宽度=-2 | 色深=32
    ' Data长度=28 | 欲截取的高度=-1 | 行宽=12 | 欲截取的宽度=3 | 色深=32
    ' Data长度=24 | 欲截取的高度=-1 | 行宽=16 | 欲截取的宽度=4 | 色深=32
    ' Data长度=20 | 欲截取的高度=5 | 行宽=-4 | 欲截取的宽度=-1 | 色深=32
    ' Data长度=16 | 欲截取的高度=3 | 行宽=-8 | 欲截取的宽度=-2 | 色深=32
    ' Data长度=12 | 欲截取的高度=7 | 行宽=-4 | 欲截取的宽度=-1 | 色深=32
    ' Data长度=8 | 欲截取的高度=-1 | 行宽=32 | 欲截取的宽度=8 | 色深=32


作者: 梦寻简单    时间: 2024-9-9 21:53
逆神者一方 发表于 2024-9-8 19:57
经过几轮测试下来,发现以下data长度会报错:
当Data长度等于以下值时,数组越界:

对呀,这宽度和高度为什么传入一个负值呢?所以,这不是bug,是用法问题。
作者: 逆神者一方    时间: 2024-9-10 14:51
梦寻简单 发表于 2024-9-9 21:53
对呀,这宽度和高度为什么传入一个负值呢?所以,这不是bug,是用法问题。 ...

一针见血,值不能小于1,内部没判断
作者: 相声界一小学生    时间: 2024-9-26 17:03

作者: 相声界一小学生    时间: 2024-9-26 17:03

作者: 相声界一小学生    时间: 2024-9-26 17:09

作者: 32y1rt3    时间: 2024-10-10 09:36
我也出现过报错
作者: Sy6666    时间: 2024-10-12 19:25
赚点精币
作者: 不离01    时间: 2025-4-10 23:37
6666666666666666
作者: 东方神功    时间: 2025-4-11 05:14

感谢
作者: yyds889    时间: 2025-6-1 17:31
经过几轮测试下来,发现以下data长度会报错




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4