找回密码
 加入
搜索
查看: 3962|回复: 25

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

[复制链接]
发表于 2009-9-17 22:32:36 | 显示全部楼层 |阅读模式
本帖最后由 倚栏听风 于 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 ,即失败。 但消息却可以发出去。 也可以正常接收到。
 楼主| 发表于 2009-9-17 22:33:09 | 显示全部楼层
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不提供单个窗口超时信息。
 楼主| 发表于 2009-9-17 22:48:18 | 显示全部楼层
恩,对了,还有一个问题是,我测试用的脚本,在SCITE 里可以运行, 但编译后就会提示错误的函数。
很奇怪的问题,不知道是哪里出错了
 楼主| 发表于 2009-9-18 16:04:47 | 显示全部楼层
额,这问题没人能解决吗?
或者说是怎样可以获得通过DLLCALL调用系统API的详细的错误信息?
 楼主| 发表于 2009-9-18 18:03:59 | 显示全部楼层
还是自顶吧。。。。
 楼主| 发表于 2009-9-19 16:21:44 | 显示全部楼层
为什么没人帮忙啊?
再顶上去
 楼主| 发表于 2009-9-20 05:57:51 | 显示全部楼层
我哭…问题很难吗?怎么都没人回复来着?
 楼主| 发表于 2009-9-20 11:02:58 | 显示全部楼层
又沉了。。。 我再顶。。。
发表于 2009-9-20 11:10:58 | 显示全部楼层
高手在的时候,你的帖子沉了,高手不在时,你的帖子浮上来了!汗!


别问我,我不是高手
 楼主| 发表于 2009-9-20 11:22:49 | 显示全部楼层
本帖最后由 倚栏听风 于 2009-9-20 11:24 编辑

唉,想哭了。。。。
坚持着顶,问题不解决,我是睡不着了。


额,大兄弟,帮个忙,请个高手来想想办法吧。
其实我最想知道的是如何在使用 DLLCALL 调用 API 后,获取详细的错误信息。
到现在没找到一种合适的方法呢。  DLLCALL 只能返回 成功或失败,更详细的错误信息都没有。。。
发表于 2009-9-20 11:31:59 | 显示全部楼层
我还是新人呢! 对DLLCALL的了解很少,实在能力有限,还是等高手来吧!

帮你顶
发表于 2009-9-20 11:55:53 | 显示全部楼层
先查查dll文件的输入数据,然后查看其输出变量,这玩意没玩过,似乎很麻烦
 楼主| 发表于 2009-9-20 12:29:57 | 显示全部楼层
查过了,貌似没问题。
输出变量?  是参数的? 还是返回值?
返回值就是错误。
发表于 2009-9-20 17:10:38 | 显示全部楼层
我还是个学生,这个问题,我觉得你应该去请教下pusofalse
 楼主| 发表于 2009-9-20 18:35:04 | 显示全部楼层
没有联系方式啊。。。
先发短消息看看吧。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 23:06 , Processed in 0.075666 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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