找回密码
 加入
搜索
查看: 5073|回复: 12

[系统综合] 程序版本(32位,64位)不一致,有可能出错的问题

  [复制链接]
发表于 2016-4-20 11:50:37 | 显示全部楼层 |阅读模式
本帖最后由 CHEARV 于 2016-4-20 17:17 编辑

最近发现一个问题,我编写的程序用32位编译运行正常,用64位编译运行就不正常。经过反复测试,终于发现了问题所在,原来版本不一致,部分自定义函数会出错,看下面的例子。

       这里有两段代码,分别编译成两个程序A和B。如果版本相同,都为32位,或者都为64位,则运行正常。 如果A为32位,B为64位,或者A为64位,B为32位,则自定义函数_GUICtrlTreeView_GetText返回值会出错。

代码A:
GUICreate("版本不一致的兼容性测试", 400, 300)
$idTreeView = GUICtrlCreateTreeView(2, 2, 396, 268);
GUISetState(@SW_SHOW)
GUICtrlCreateTreeViewItem("测试文字", $idTreeview)
Do
Until GUIGetMsg() = -3
GUIDelete()
代码B
#include <GuiTreeView.au3>
$s = "32"
If @AutoItX64 Then $s = "64"

$hTreeView32 = ControlGetHandle("版本不一致的兼容性测试", "", "SysTreeView321")
$sReturn = _GUICtrlTreeView_GetText($hTreeView32)
MsgBox(4096,$s & "位运行结果","@error值: " & @error & @CRLF & "返回值: " & $sReturn)
我是在WIN10 64位下测试的,AU3版本为3.3.14.2。

例如,A程序为64位版本,B程序64位的返回值正确,32位返回值为空。

如果在系统中同时需要操作32位和64位的程序,则容易出错。不知道这算不算是个BUG。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-4-20 12:09:04 | 显示全部楼层
我只知道有些udf不兼容64位系统,禁用64位编译即可
发表于 2016-4-20 12:17:54 | 显示全部楼层
出错是出什么错  程序崩溃? 返回值错误? 还是其它
如果是程序崩溃 可以更换旧版试试
如果是返回值错误  那可以在代码B中添加返回值及@Error查看
 楼主| 发表于 2016-4-20 14:33:50 | 显示全部楼层
回复 3# afan


      问题说得不够清楚,不好意思啊。

就是返回值出错。版本相同时,返回值正常,上面的代码_GUICtrlTreeView_GetText返回值是 测试文字。而当版本不同时,_GUICtrlTreeView_GetText的返回值是空值,而非 测试文字。
 楼主| 发表于 2016-4-20 14:53:03 | 显示全部楼层
回复 2# hnfeng


      但是,你用32位编译的程序,如果使用了这些UDF,那么在用这些UDF操作一些64位程序创建的控件时,也会出错啊。只是目前64位的程序不多,碰到的概率不大。
发表于 2016-4-20 15:13:44 | 显示全部楼层
回复  afan


      问题说得不够清楚,不好意思啊。

就是返回值出错。版本相同时,返回值正常,上面 ...
CHEARV 发表于 2016-4-20 14:33



    还有@Error值啊…
 楼主| 发表于 2016-4-20 17:20:01 | 显示全部楼层
回复 6# afan


@error都为0。

刚刚编辑了原贴,重新改过代码了,并且上传了图片,这样比较容易看到问题了。
发表于 2016-4-20 17:47:46 | 显示全部楼层
回复  afan


@error都为0。

刚刚编辑了原贴,重新改过代码了,并且上传了图片,这样比较容易看到问 ...
CHEARV 发表于 2016-4-20 17:20


你这是否为 32 位程序 与 64 位程序交叉互读吗...........
发表于 2016-4-20 21:04:51 | 显示全部楼层
回复 7# CHEARV


    这就不清楚了  只有自己在udf 相关位置插入调试了
发表于 2016-4-20 21:45:57 | 显示全部楼层
_GUICtrlListView_GetText也会出现这种情况,win10、64位机器编译的64位程序在32位机器上取不到值,编译成32位的程序就没问题了。
 楼主| 发表于 2016-4-20 22:15:15 | 显示全部楼层
回复 8# 131738


     是的,这只是举个例子。主要是想表达的意思是,在编译带有这些UDF的脚本时,需要考虑版本问题。如果你要操作的程序是32位的,那么我们在编译自己的AU3脚本时,就应选择32位。

     现在的问题是,假设我以后需要操作两个程序,其中一个是32位,另一个是64位。那如果我的脚本用到了上面那些UDF,就没法运行了。
发表于 2016-4-24 17:05:11 | 显示全部楼层
64位有个重定向
发表于 2016-4-27 21:03:29 | 显示全部楼层
   我全部都用32位编译
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-26 10:05 , Processed in 0.082962 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表