找回密码
 加入
搜索
查看: 3164|回复: 9

[AU3基础] 为何存在"内存不能写"而脚本死掉[已解决]

  [复制链接]
发表于 2011-1-11 09:48:00 | 显示全部楼层 |阅读模式
本帖最后由 happytc 于 2011-1-21 19:05 编辑

如图所示,是运行:DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)
而死掉的,其中509是Total Commander中的解压命令。完整代码如下,我一按Alt+F6后,au3脚本就死掉,出来如图的提示
HotKeySet("!{F6}", "TCUnpackSameDir")
While 1
        Sleep(100)
WEnd

Func TCUnpackSameDir()
        Local $TCclass2, $TCControl2, $TCControl3, $Flag1, $Flag2

        $TCclass2 = "[CLASS:TDLGUNZIPALL]"
        $TCControl2 = "TCheckBox1"
        $TCControl3 = "TButton4"
        $hwd = WinGetHandle("[CLASS:TTOTAL_CMD]")
        DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)
        If WinWaitActive($TCclass2) Then
                ControlSend($TCclass2, "", "TAltEdit1", "{DEL}")
                ControlCommand($TCclass2, "", $TCControl2, "Check")
                ControlCommand($TCclass2, "", $TCControl3, "Check")
        EndIf
EndFunc
 楼主| 发表于 2011-1-11 09:49:43 | 显示全部楼层

忘了传图了,如上图所示。
奇怪的是,同样的应用,ahk一点问题都没有,其代码如下:

$!F6::
IfWinActive ahk_class TTOTAL_CMD
{
        PostMessage, 1075, 509
        WinWaitActive, ahk_class TDLGUNZIPALL
        Send, {Del}
        Control, Check, , TCheckBox1
        Send, {Enter}
}
else
        Send !{F6}
return

本帖子中包含更多资源

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

×
 楼主| 发表于 2011-1-11 09:56:49 | 显示全部楼层
本帖最后由 happytc 于 2011-1-11 09:58 编辑

另外,我把上面au3代码中,把那行DLLCall()的换成:ControlSend($TCclass2, "", "Edit1", "cm_UnpackFiles"),别的一点不变,就一点问题没有了,难道是au3的DLLCall有bug?

神奇的是我重启机子后,第一次用,不会死,并且还会解压。再用就死掉,跳出上图了
发表于 2011-1-11 10:58:36 | 显示全部楼层
POSTMessage 与 SendMessage 是两个不同的函数,区分清楚的话,应该就没问题了。

我猜测是TC在收到消息后,还没处理完你就再用AU3给他第二个消息。

至于崩溃这个问题是Sendmessage的问题还是Au3的问题就不清楚了。
 楼主| 发表于 2011-1-12 20:45:20 | 显示全部楼层
谢谢republican你的回复
上面只是给个例子,不关是SendMessage或PostMessage的事,因用Postmessage一样会死掉,就是上面的换成:
DllCall("user32.dll", "int", "PostMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)

一样会出现脚本死掉,如下图

本帖子中包含更多资源

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

×
 楼主| 发表于 2011-1-12 20:47:34 | 显示全部楼层
同样,在ahk里,达到同样的功能,不管是用Postmessage还是Sendmessage都没有问题
为什么在au3里一用就死掉呢??这个问题困惑了我好久了。希望有大侠可以解惑一下
发表于 2011-1-12 21:22:47 | 显示全部楼层
明显是SendMessage的参数用错了
函数原形:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
再对照下你自己的.
 楼主| 发表于 2011-1-12 21:45:05 | 显示全部楼层
回复 7# ceoguang

winAPI的Sendmessage是四个参数,这个我知道,只是看了au3的DLLCall原型,其后面的参数都是用中括号括起来的,说明可以忽略,再则以前是用ahk的,也都是这样忽略后面的lParam参数了,所以误解以为au3里也是这样可以用呢。原来au3里,必须把winAPI里的函数参数写全了才不会出问题。

也就是上面的必须这样才能正确在au3里用:
DllCall("user32.dll", "int", "PostMessage", "hwnd", $hwd , "int" , 1075 , "int", 509, "int", "")
其中的1075是:WM_USER+51
发表于 2011-1-12 22:30:55 | 显示全部楼层
....
看来你还是没了解.
那就用封装好的自定义函数吧.
_SendMessage($hWnd, 1075, 509)
 楼主| 发表于 2011-1-12 23:01:20 | 显示全部楼层
....
看来你还是没了解.
那就用封装好的自定义函数吧.
ceoguang 发表于 2011-1-12 22:30


若我没有理解,能不能麻烦您把出问题这句:DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)改成可以用的DLLCall调用形式吧。我想有了例子,应该更容易理解了。我不用封装的,这里举Sendmessage只是为了说明DLLCall函数应用来的个例子,平时还需要调用大量的winAPI的函数。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-2 16:27 , Processed in 0.076242 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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