本帖最后由 倚栏听风 于 2009-9-25 06:32 编辑
Coproc.au3 一个多进程模拟多线程的UDF 。
我在使用 _CoProcSend 函数给母进程发送消息时,总是会出错,返回错误代码 3 。
没有找到问题所在,请各位高人指点一下。
AUTOIT 是最新的 3.3.1.1-2 汉化版 论坛里下载的。
Coproc.au3 是从 www.autoitscript.com 下载的最新版
我测试用的代码,请大家看一下是不是哪里有问题?#include <coproc.au3>
_CoProc("getfile")
_CoProcReciver("x")
While 1
sleep(100)
WEnd
Func getfile()
$url = "http://222.89.195.226:81/WindowsXP_SP2.exe"
$hd = InetGet($url , @TempDir & "\1.exe" , 1 , 1 )
While Not InetGetInfo($hd,2)
_CoProcSend($gi_CoProcParent,InetGetInfo($hd),1000)
MsgBox(0,"",@error)
WEnd
EndFunc
Func x($v)
ToolTip($v)
EndFunc
coproc.au3 里的 _coprocsend 函数Func _CoProcSend($vProcess, $vParameter, $iTimeout = 500, $fAbortIfHung = True)
Local $iPid, $hWndTarget, $MyData, $aTmp, $COPYDATA, $iFuFlags
$iPid = ProcessExists($vProcess)
If Not $iPid Then Return SetError(1, 0, False) ; Process not Found
$hWndTarget = _ProcessGetWinList($vProcess, "", 16 + 2)
If @error Or (Not $hWndTarget) Then Return SetError(2, 0, False) ; Window not found
$MyData = DllStructCreate("char[" & StringLen($vParameter) + 1 & "]")
$COPYDATA = DllStructCreate("ptr;dword;ptr")
DllStructSetData($MyData, 1, $vParameter)
DllStructSetData($COPYDATA, 1, 1)
DllStructSetData($COPYDATA, 2, DllStructGetSize($MyData))
DllStructSetData($COPYDATA, 3, DllStructGetPtr($MyData))
If $fAbortIfHung Then
$iFuFlags = 0x2 ; SMTO_ABORTIFHUNG
Else
$iFuFlags = 0x0 ; SMTO_NORMAL
EndIf
$aTmp = DllCall("user32.dll", "int", "SendMessageTimeout", "hwnd", $hWndTarget, "int", 0x4A _; WM_COPYDATA
, "int", 0, "ptr", DllStructGetPtr($COPYDATA), "int", $iFuFlags, "int", $iTimeout, "long_ptr", 0)
If @error Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
If Not $aTmp[0] Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
If $aTmp[7] <> 256 Then Return SetError(3, 0, False)
$aTmp = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWndTarget, "int", 0x400 + 0x64, "int", 0, "int", 0)
If @error Then Return SetError(4, 0, False)
If Not $aTmp[0] Then Return SetError(4, 0, False)
Return True
EndFunc ;==>_CoProcSend
可以看出是在
$aTmp = DllCall("user32.dll", "int", "SendMessageTimeout", "hwnd", $hWndTarget, "int", 0x4A _; WM_COPYDATA
, "int", 0, "ptr", DllStructGetPtr($COPYDATA), "int", $iFuFlags, "int", $iTimeout, "long_ptr", 0)
If @error Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
调用 SendMessageTimeout API 时出错,可我不知道在AU3下该用什么方法可以看到更详细的错误信息。 只知道是出错了,不知道问题是出在哪里。
还请各位指点一下。。。
问题解决。。。。HOHO~~~
问题
1、 CoProcSend 函数报错。
解决方法,注释掉
If $aTmp[7] <> 256 Then Return SetError(3, 0, False)
2、无法接受消息
解决方法,注释掉
__CoProcReciverHandler 函数里的
Return 256
ElseIf $iMsg = 0x400 + 0x64 Then ; WM_USER+0x64
并修改 if $iMsg = 0x4A then 为 if $iMsg = 74 then
传递过来的是 10进制,而这里判断的却是16进制。
如果消息发送的比较频繁的话,不必每次调用 CoProcSend 函数后做除错处理。
sendmessagetimeout 有时返回 0 ,即失败。 但消息却可以发出去。 也可以正常接收到。 |