找回密码
 加入
搜索
楼主: 倚栏听风

coproc.AU3 _CoProcSend函数错误问题。 HOHO~~~解决啦。。

[复制链接]
 楼主| 发表于 2009-9-21 07:44:06 | 显示全部楼层
又沉了… 我顶…
 楼主| 发表于 2009-9-21 09:43:18 | 显示全部楼层
本帖最后由 倚栏听风 于 2009-9-21 09:46 编辑

额,今天早上又看了一下。
才发现一个严重的问题
我竟然没发现下面的语句,这个是我的错。
If @error Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
;这个是 DLLCALL 调用出错 则返回失败,并设置 @ERROR 为 3  一般为参数数量错误
If Not $aTmp[0] Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
;这个是 API 返回值告诉我们 该API失败,比如参数错误之类的? 我也不太清楚。 没试过,猜得。 成功返回非0 ,失败返回 0
If $aTmp[7] <> 256 Then Return SetError(3, 0, False)
; 这个就不知道了。 $aTmpv[7] 不等于 256 则返回失败。 不知道这是个什么值,为什么要必须等于 256
这才发现是最后一行出的错。
我读出这个数组的8个元素的值
0        1
1        0x001302EE
2        74
3        0
4        0X014AB660
5        2
6        500
7        0
可惜的是不知道是什么意思,有达人清楚的话告诉偶一下好不好?
发表于 2009-9-21 09:50:26 | 显示全部楼层
大兄弟真为你着急啊!可惜爱莫能助,望能有高手来解决啊!
发表于 2009-9-21 21:59:00 | 显示全部楼层
给楼主提个意见,这东西问  文白兄  、 gooker兄、pcbar大神比较好,他们对多线程研究较多
 楼主| 发表于 2009-9-22 21:15:49 | 显示全部楼层
嗯,了解,谢楼上的兄弟,我晚会去搜索下他们的帖子瞧瞧看…
这东西已经了解差不多了…
这几天要好好研究研究
发表于 2009-9-22 21:39:32 | 显示全部楼层
恩,祝你成功,别忘了到时上来炫一下啊
 楼主| 发表于 2009-9-22 23:01:47 | 显示全部楼层
嘿嘿,没问题…
到时会把结果放上来的…
额,我用的手机发的…
发表于 2009-9-23 09:03:31 | 显示全部楼层
那 很强。。。
 楼主| 发表于 2009-9-25 05:00:53 | 显示全部楼层
本帖最后由 倚栏听风 于 2009-9-25 05:04 编辑

自问自答一下。
 sendmessagetimeout 的返回值。 
数组 有8个元素
相应的 第一个元素 $atmp[0] 为执行结果,成功为非0值 。执行失败为 0 
从1-7 这7个元素的内容为调用 sendmessagetimeout 时的参数。
0        1
执行结果 1 为执行成功
1        0x001302EE
要发送消息的窗口句柄
2        74
发送消息的类型 WM_COPYDATA 。 十六进制为 0x4A  十进制就是 74 了
3        0
 这个是 0
4        0X014AB660
 DllStructGetPtr($COPYDATA) 返回的指针。
5        2
$iFuFlags 的值。 0x2
6        500
$itimeout 超时值 500
7        0
最后这个就是最奇怪的了。
传递过去的参数是 long_ptr 类型 大型整数指针 。该值为 0
但是到函数最后 却要  $atmp[7]  的值为 256 。
很奇怪,百思不得其解。
 楼主| 发表于 2009-9-25 05:37:24 | 显示全部楼层
本帖最后由 倚栏听风 于 2009-9-25 05:42 编辑

他妈的,太扯了。
74 不等于 0X4A

刚怀疑是不是接收上的问题,看了一下_CoProcReciver 函数
发现以下问题

实际上,处理消息的函数 是 __CoProcReciverHandler 。 它处理完以后,才交给我们定义的函数的。
不过问题不在这里
第16 行 和 第22行。
if $imsg = 0x4a then .....
他娘的,我看了一下 $IMsg的值。 一个是 74 一个是 1124
转成 16 进制可不就是 0X4A 和 0X400+0X64 嘛。
我日。 不过刚不知怎么弄的, SENDMESSAGETIMEOUT 也出错了。
Func _CoProcReciver($sFunction = Default)
        Local $sHandlerFuction = "__CoProcReciverHandler", $hWnd, $aTmp
        If IsKeyword($sFunction) Then $sFunction = ""
        $hWnd = _ProcessGetWinList(@AutoItPID, "", 16 + 2)
        If Not IsHWnd($hWnd) Then
                $hWnd = GUICreate("CoProcEventReciver")
                If @error Then Return SetError(1, 0, False)
        EndIf
        If $sFunction = "" Or IsKeyword($sFunction) Then $sHandlerFuction = ""
        If Not GUIRegisterMsg(0x4A, $sHandlerFuction) Then Return SetError(2, 0, False) ; WM_COPYDATA
        If Not GUIRegisterMsg(0x400 + 0x64, $sHandlerFuction) Then Return SetError(2, 0, False) ; WM_USER+0x64
        $gs_CoProcReciverFunction = $sFunction
        Return True
EndFunc   ;==>_CoProcReciver
Func __CoProcReciverHandler($hWnd, $iMsg, $WParam, $LParam)
        If $iMsg = 0x4A Then ; WM_COPYDATA
                Local $COPYDATA, $MyData
                $COPYDATA = DllStructCreate("ptr;dword;ptr", $LParam)
                $MyData = DllStructCreate("char[" & DllStructGetData($COPYDATA, 2) & "]", DllStructGetData($COPYDATA, 3))
                $gv_CoProcReviverParameter = DllStructGetData($MyData, 1)
                Return 256
        ElseIf $iMsg =  0x400 + 0x64 Then ; WM_USER+0x64
                If $gv_CoProcReviverParameter Then
                        Call($gs_CoProcReciverFunction, $gv_CoProcReviverParameter)
                        If @error And @Compiled = 0 Then MsgBox(16, "CoProc Error", "Unable to Call: " & $gs_CoProcReciverFunction)
                        $gv_CoProcReviverParameter = 0
                        Return 0
                EndIf
        EndIf
EndFunc   ;==>__CoProcReciverHandler
发表于 2009-9-25 10:19:51 | 显示全部楼层
恭喜解决
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 15:33 , Processed in 0.076760 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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