程序版本(32位,64位)不一致,有可能出错的问题
本帖最后由 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。 我只知道有些udf不兼容64位系统,禁用64位编译即可 出错是出什么错程序崩溃? 返回值错误? 还是其它
如果是程序崩溃 可以更换旧版试试
如果是返回值错误那可以在代码B中添加返回值及@Error查看 回复 3# afan
问题说得不够清楚,不好意思啊。
就是返回值出错。版本相同时,返回值正常,上面的代码_GUICtrlTreeView_GetText返回值是 测试文字。而当版本不同时,_GUICtrlTreeView_GetText的返回值是空值,而非 测试文字。 回复 2# hnfeng
但是,你用32位编译的程序,如果使用了这些UDF,那么在用这些UDF操作一些64位程序创建的控件时,也会出错啊。只是目前64位的程序不多,碰到的概率不大。 回复afan
问题说得不够清楚,不好意思啊。
就是返回值出错。版本相同时,返回值正常,上面 ...
CHEARV 发表于 2016-4-20 14:33 http://www.autoitx.com/images/common/back.gif
还有@Error值啊… 回复 6# afan
@error都为0。
刚刚编辑了原贴,重新改过代码了,并且上传了图片,这样比较容易看到问题了。 回复afan
@error都为0。
刚刚编辑了原贴,重新改过代码了,并且上传了图片,这样比较容易看到问 ...
CHEARV 发表于 2016-4-20 17:20 http://www.autoitx.com/images/common/back.gif
你这是否为 32 位程序 与 64 位程序交叉互读吗........... 回复 7# CHEARV
这就不清楚了只有自己在udf 相关位置插入调试了 _GUICtrlListView_GetText也会出现这种情况,win10、64位机器编译的64位程序在32位机器上取不到值,编译成32位的程序就没问题了。 回复 8# 131738
是的,这只是举个例子。主要是想表达的意思是,在编译带有这些UDF的脚本时,需要考虑版本问题。如果你要操作的程序是32位的,那么我们在编译自己的AU3脚本时,就应选择32位。
现在的问题是,假设我以后需要操作两个程序,其中一个是32位,另一个是64位。那如果我的脚本用到了上面那些UDF,就没法运行了。 64位有个重定向 {:face (197):} 我全部都用32位编译
页:
[1]