happytc 发表于 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 = ""
        $TCControl2 = "TCheckBox1"
        $TCControl3 = "TButton4"
        $hwd = WinGetHandle("")
        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

happytc 发表于 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

happytc 发表于 2011-1-11 09:56:49

本帖最后由 happytc 于 2011-1-11 09:58 编辑

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

神奇的是我重启机子后,第一次用,不会死,并且还会解压。再用就死掉,跳出上图了

republican 发表于 2011-1-11 10:58:36

POSTMessage 与 SendMessage 是两个不同的函数,区分清楚的话,应该就没问题了。

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

至于崩溃这个问题是Sendmessage的问题还是Au3的问题就不清楚了。

happytc 发表于 2011-1-12 20:45:20

谢谢republican你的回复
上面只是给个例子,不关是SendMessage或PostMessage的事,因用Postmessage一样会死掉,就是上面的换成:
DllCall("user32.dll", "int", "PostMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)

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

happytc 发表于 2011-1-12 20:47:34

同样,在ahk里,达到同样的功能,不管是用Postmessage还是Sendmessage都没有问题
为什么在au3里一用就死掉呢??这个问题困惑了我好久了。希望有大侠可以解惑一下

ceoguang 发表于 2011-1-12 21:22:47

明显是SendMessage的参数用错了
函数原形:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);再对照下你自己的.

happytc 发表于 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

ceoguang 发表于 2011-1-12 22:30:55

....
看来你还是没了解.
那就用封装好的自定义函数吧._SendMessage($hWnd, 1075, 509)

happytc 发表于 2011-1-12 23:01:20

....
看来你还是没了解.
那就用封装好的自定义函数吧.
ceoguang 发表于 2011-1-12 22:30 http://www.autoitx.com/images/common/back.gif

若我没有理解,能不能麻烦您把出问题这句:DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwd , "int" , 1075 , "int", 509)改成可以用的DLLCall调用形式吧。我想有了例子,应该更容易理解了。我不用封装的,这里举Sendmessage只是为了说明DLLCall函数应用来的个例子,平时还需要调用大量的winAPI的函数。
页: [1]
查看完整版本: 为何存在"内存不能写"而脚本死掉[已解决]