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