精易论坛

标题: 精易模块关于句柄bug [打印本页]

作者: 王大家族    时间: 2017-5-25 17:07
标题: 精易模块关于句柄bug
窗口句柄应该是长整数,而模块返回的句柄都是整数型。而易语言整数型是符号整数,也就是存在句柄为负数的情况。

模块中存在许多命令,句柄只判断大于0的情况,比如窗口取句柄——模糊 和 网页_取IE窗口句柄。正确是应该是句柄不等0。
其中网页_取IE窗口句柄严重影响了填表的初始化,结果就是不知道为什么软件就不能正常填表。

作者: 1051496412    时间: 2017-5-25 17:09
这个得多巧....用了很久还没遇到过这种情况
作者: 1051496412    时间: 2017-5-25 17:10
楼主方便提供一下使用情景吗,我用这个很久也没遇到过哈...是不是运气太好了
作者: 王大家族    时间: 2017-5-25 17:11
1051496412 发表于 2017-5-25 17:09
这个得多巧....用了很久还没遇到过这种情况

我的软件24*7运行,所以经常遇到.
作者: 王大家族    时间: 2017-5-25 17:14
王大家族 发表于 2017-5-25 17:11
我的软件24*7运行,所以经常遇到.

可能你取到的句柄永远大于0,我的电脑取的句柄存在小于0的情况。win7 64位。4秒取一次句柄,24*7无休,运行。
作者: 御风软件    时间: 2017-5-25 18:58
竟然认为是超出整形范围导致的负值。
至今未发现句柄值,超过21亿的,难道你的电脑超神了?
判断不等于0是错误的做法,负数也是不等于0
有效的句柄值,都是大于0的,判断并没有出错。
作者: 王大家族    时间: 2017-5-25 19:32
御风软件 发表于 2017-5-25 18:58
竟然认为是超出整形范围导致的负值。
至今未发现句柄值,超过21亿的,难道你的电脑超神了?
判断不等于0 ...

呵呵。如果你不相信,我以后可以截图给你看,有图有真相。你这心态不行。
作者: 王大家族    时间: 2017-5-25 19:39
御风软件 发表于 2017-5-25 18:58
竟然认为是超出整形范围导致的负值。
至今未发现句柄值,超过21亿的,难道你的电脑超神了?
判断不等于0 ...

你去百度下有符号整数。了解之后再来说这些。
作者: 御风软件    时间: 2017-5-25 20:36
王大家族 发表于 2017-5-25 19:32
呵呵。如果你不相信,我以后可以截图给你看,有图有真相。你这心态不行。

无知可以,但是,无知到也认为别人和你一样,就是愚蠢了。

请问,我说的那点有错?还让我百度,笑死我了
整数型,易语言的是有符号整形,存储的值的范围是-21亿到21亿
让窗口的句柄的值超过21亿,导致不够用,那你得打开多少个窗口/组件?
所以,返回负数,根本就不是因为数据类型溢出导致的!所以你的说法有误!

麻烦你再认真看下我的回复,再看你自己是什么心态,在教你东西,还以为嘲笑你。
我的回复,只说明了2个东西!而我不知道你看到的,都曲解成了什么样!

1.句柄负数,不是因为超出整形范围导致的,因为整形是21亿的整数值。
2.有效的句柄是大于0的,等于0和负数都是无效的句柄,在不等于0的条件下,负数时也是是成立的
而模块中的代码,是判断句柄有效(也就是句柄 > 0)才会进行后续操作,难道,你认为负数也是有效的?


你反馈BUG没有错,但是你所提供的反馈,2个论证观点都是错的!
我没有说模块没有BUG,也没说肯定你电脑有问题,只是表达,你说的内容是错误的
作者: 御风软件    时间: 2017-5-25 20:39
王大家族 发表于 2017-5-25 19:39
你去百度下有符号整数。了解之后再来说这些。

在转换的时候,高精度向低精度转换时,如果值超过,会溢出,才会导致出现负数

但是,整形的正数范围是21亿左右,也就是你传入一个超过21亿的数,才会出现负数

就算你是长整数,只要你不存储超过21亿的这样大的数字,赋值给整数就不会有溢出
作者: 王大家族    时间: 2017-5-25 20:42
御风软件 发表于 2017-5-25 20:36
无知可以,但是,无知到也认为别人和你一样,就是愚蠢了。

请问,我说的那点有错?还让我百度,笑死我 ...

我明明看到,负数的句柄也是有效的。自从把条件改为不等0,就不再出现问题。
作者: 御风软件    时间: 2017-5-25 20:51
王大家族 发表于 2017-5-25 20:42
我明明看到,负数的句柄也是有效的。自从把条件改为不等0,就不再出现问题。

WIN 下的句柄,默认情况下都是递增的,由系统管理。有可能会重用
你可以用编程助手,你看一下窗口,组件的句柄,一般的值,都是几万到几十万之间。

百度百科,自己看下句柄的定义:http://baike.baidu.com/item/%E5%8F%A5%E6%9F%84
句柄有2种,一种是指针,一种是对象标识,但是,都不可以是负数。

从上面的2个定义中我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位(或64位)的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。

你修改了代码不出问题,那可能是真的原来的模块有BUG。
你修改了没有出问题,那么,你应该把修改后的代码,给贴出来


作者: 御风软件    时间: 2017-5-25 20:55
王大家族 发表于 2017-5-25 20:42
我明明看到,负数的句柄也是有效的。自从把条件改为不等0,就不再出现问题。

我说的只是原理,但是代码怎么用,具体情况,具体分析。
就像有的时候,我们写代码,真的时候执行,也可能假的时候执行
所以,我还是那句话,我不是说模块没有BUG,也不确定是你电脑问题。
最好,还是贴出原来的代码,和你修改后的代码,才方便定位是什么导致的
作者: 王大家族    时间: 2017-5-25 20:55
御风软件 发表于 2017-5-25 20:39
在转换的时候,高精度向低精度转换时,如果值超过,会溢出,才会导致出现负数

但是,整形的正数范围是 ...

句柄应该是长整数的,这种情况下句柄永远是大于0的。我说的负数指的是整数型的负数。如果是整数型的,他是不可能真的是负数,而是因为数值超过整数型正整数范围,又因整数型是有符号的,所以变成负数。并不是真的是负数。考虑这种情况,写代码的时候,就应该是不等于0.
作者: 王大家族    时间: 2017-5-25 20:57
御风软件 发表于 2017-5-25 20:55
我说的只是原理,但是代码怎么用,具体情况,具体分析。
就像有的时候,我们写代码,真的时候执行,也可 ...

不再争辩。
作者: 王大家族    时间: 2017-5-25 20:59
御风软件 发表于 2017-5-25 20:55
我说的只是原理,但是代码怎么用,具体情况,具体分析。
就像有的时候,我们写代码,真的时候执行,也可 ...

再说那个问题 我已经解决一年了,之后就不再有问题了。我只是看模块还是没有改,才反应的。改不改由他们。
作者: 御风软件    时间: 2017-5-25 21:11
王大家族 发表于 2017-5-25 20:55
句柄应该是长整数的,这种情况下句柄永远是大于0的。我说的负数指的是整数型的负数。如果是整数型的,他 ...

整数的正数范围是21亿。所以超过后,才会溢出导致的负数。
但是,一般来说,句柄的值都是几万到几十万的,连上亿都差十万八千里,怎么会超过?
而且,按你这理论级别,那易语言自身的那个数据类型都是不对的,长整数也是有符号的!
你可以看看其他的编程语言,或者易语言模块,看那个存储句柄不是用的整形而是长整型的。

可以很明确的告诉你,返回负数,不是因为因为这个句柄有效而整数放不下导致的。
但是具体是什么,我也不知道,因为,我没有看到你的代码,但是你相信超过21亿的句柄么?
你相信,是返回了一个超过了值是21亿的有效句柄,然后因为整数放不下,变成了负数显示么?
作者: 猥琐小胖子    时间: 2017-5-25 21:27
窗口句柄用4字节表示没问题。
你最好说下啥情况下另外代码改啥的。
还有64位和32位之间的共享也是用的4字节,只取低32位的。
作者: jjf05    时间: 2017-5-26 07:39
看看有什么好宝贝
作者: 王大家族    时间: 2017-5-26 08:13
猥琐小胖子 发表于 2017-5-25 21:27
窗口句柄用4字节表示没问题。
你最好说下啥情况下另外代码改啥的。
还有64位和32位之间的共享也是用的4字 ...

有符号整数,因为有正负之分,所以最高位的表示正负,0为正,1为负。
.版本 2

t = 2147483647;整数型最大值
b= t + 1
输出调试文本(b),b变成负数,即-2147483648。
但是这个数仍然是四字节。如果句柄要表示为大于0,就应该是长整数。
作者: 黑白郎君    时间: 2017-5-26 12:32
这问题似乎越扯越远了,没有紧密联系的问题。再讨论也没意义。一个想表达句柄 用整数型,溢出会变负数,这是没错的,溢出了当然是负数,那么问题又来了,句柄有可能超过整数型的范围吗?这问题又是可以认为是不可能的!毕竟范围已经达到了十位数,还是回到原来的问题。说的改为不等于0就正常了,你这代码具体怎么样的,没贴出来也无法讨论。
作者: 王大家族    时间: 2017-5-26 13:08
黑白郎君 发表于 2017-5-26 12:32
这问题似乎越扯越远了,没有紧密联系的问题。再讨论也没意义。一个想表达句柄 用整数型,溢出会变负数,这 ...

我百度了,并搜索了论坛。找到几个和我一样的例子。无一例外的就是 他们的软件高频次的句柄操作。比如我的软件是全年无休运行的,一天取句柄的次数最少35万次。在这种高频率的情况下,取到负数变成很经常,但也绝大部份是正整数。如果只偶尔几次,那都取到的是正值。而且不只精易模块取到的会是负的,其他模块也一样。超文本浏览框.取窗口句柄也存在是负值,而且无数次验证整数型负数句柄是可以操作的。我得出这个结论用了半年,我的软件我整整开发了4年,现在还在修改。因为这个bug困扰了我无数次,我修正以后就没再发现相关问题。我只提供一个精易命令bug,其他相似。
.版本 2

.子程序 窗口_取句柄_模糊 整数型, 公开, 成功返回指定窗口句柄,失败返回0
.参数 窗口标题, 文本型, 可空, 标题支持模糊,如窗口的标题为【精易⌒技术交流群①】你只需要【流群①】取可
.参数 窗口的类名, 文本型, 可空, 类名必须为精确的,或者不填
.局部变量 窗口句柄, 整数型
.局部变量 TitleName, 文本型

.判断循环首 (真)
    窗口句柄 = FindWindowExA_文本 (0, 窗口句柄, 窗口的类名, 字符 (0))
    .如果 (窗口句柄 > 0)
        TitleName = 到小写 (窗口_取标题 (窗口句柄))

        .如果真 (寻找文本 (TitleName, 到小写 (窗口标题), , 假) ≠ -1)
            返回 (窗口句柄)
        .如果真结束

    .否则
        跳出循环 ()
    .如果结束

.判断循环尾 ()
返回 (0)


这种高频次取句柄的情况下,必须是窗口句柄不等于0才对。你可以不相信我,但我相信我的所见所得,因为你们并没有和我相同的经历。
作者: 项目部002    时间: 2017-6-24 11:51
看到了大家激烈的讨论。我也查阅了官方的资料,官方对于FindWindow返回值说明是这样的
  1. Return value
  2. Type: HWND
  3. If the function succeeds, the return value is a handle to the window that has the specified class name and window name.
  4. [b]If the function fails, the return value is [color=#ff0000]NULL[/color][/b]. To get extended error information, call GetLastError.
复制代码

如果函数失败,返回值是NULL(C语言中定义为0)


这里呢,决定使用官方的标准,即:判断返回值是否等于0(NULL),如果等于0则表示失败。



作者: Oyta    时间: 2017-7-5 20:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: 晓天信    时间: 2018-10-20 11:22
我现在也遇到了这个为了
作者: 晓天信    时间: 2018-10-20 11:23
我现在也遇到了这个问题了· 取到的句柄有负数的
作者: 晓天信    时间: 2018-10-20 11:59
大佬 你这个问题 解决了吗 我的还没解决
作者: 王大家族    时间: 2018-10-25 18:09
晓天信 发表于 2018-10-20 11:22
我现在也遇到了这个为了

精易模块升级最新版本就可以了,之前反馈过了已经改了。判断句柄是否有效的条件是:  句柄是否等于0,小于0的句柄也是有效的。
作者: aa3699    时间: 2022-6-6 15:53
确实有负整数的句柄哦,我遇到了,用编程助手看了一下,确实是这样的。

1654501945(1).jpg (33.09 KB, 下载次数: 0)

1654501945(1).jpg





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