coproc.AU3 _CoProcSend函数错误问题。 HOHO~~~解决啦。。
本帖最后由 倚栏听风 于 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)
EndFunccoproc.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 Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
If $aTmp <> 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 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 <> 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 ,即失败。 但消息却可以发出去。 也可以正常接收到。 SendMessageTimeout 函数
函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,并且,如果指定的窗口属于不同的线程,直到窗口程序处理完消息或指定的超时周期结束函数才返回。如果接收消息的窗口和当前线程属于同一个队列,窗口程序立即调用,超时值无用。
函数原型:LRESULT SendMessageTimeout(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM IParam,UINTfuFlags,UIUT uTimeout,LPDWORD lpdwResultult);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
fuFlags;指定如何发送消息。此参数可为下列值的组合:
SMTO_ABORTIFHUNG:如果接收进程处于“hung”状态,不等待超时周期结束就返回。
SMTO_BLOCK:阻止调用线程处理其他任何请求,直到函数返回。
SMTO_NORMAL:调用线程等待函数返回时,不被阻止处理其他请求。
SMTO_ONTIMEOUTIFNOTHUNG:Windows 95及更高版本:如果接收线程没被挂起,当超时周期结束时不返回。
uTimeout:为超时周期指定以毫秒为单位的持续时间。如果该消息是一个广播消息,每个窗口可使用全超时周期。例如,如果指定5秒的超时周期,有3个顶层窗回未能处理消息,可以有最多15秒的延迟。
IpdwResult:指定消息处理的结果,依赖于所发送的消息。
返回值:如果函数调用成功,返回非零值。如果函数调用失败,或超时,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。如果GetLastError返回零,表明函数超时。如果使用HWND_BROADCAST,SenddMessaggTimeout不提供单个窗口超时信息。 恩,对了,还有一个问题是,我测试用的脚本,在SCITE 里可以运行, 但编译后就会提示错误的函数。
很奇怪的问题,不知道是哪里出错了 额,这问题没人能解决吗?
或者说是怎样可以获得通过DLLCALL调用系统API的详细的错误信息? 还是自顶吧。。。。 为什么没人帮忙啊?
再顶上去 我哭…问题很难吗?怎么都没人回复来着? 又沉了。。。 我再顶。。。 高手在的时候,你的帖子沉了,高手不在时,你的帖子浮上来了!汗!
别问我,我不是高手 本帖最后由 倚栏听风 于 2009-9-20 11:24 编辑
唉,想哭了。。。。
坚持着顶,问题不解决,我是睡不着了。
额,大兄弟,帮个忙,请个高手来想想办法吧。
其实我最想知道的是如何在使用 DLLCALL 调用 API 后,获取详细的错误信息。
到现在没找到一种合适的方法呢。DLLCALL 只能返回 成功或失败,更详细的错误信息都没有。。。 我还是新人呢! 对DLLCALL的了解很少,实在能力有限,还是等高手来吧!
帮你顶 先查查dll文件的输入数据,然后查看其输出变量,这玩意没玩过,似乎很麻烦 查过了,貌似没问题。
输出变量?是参数的? 还是返回值?
返回值就是错误。 我还是个学生,这个问题,我觉得你应该去请教下pusofalse 没有联系方式啊。。。
先发短消息看看吧。
页:
[1]
2