找回密码
 加入
搜索
查看: 4113|回复: 11

[系统综合] [已解决]请教,两个正在运行的AU3程序如何交换数据?

  [复制链接]
发表于 2013-11-21 10:44:30 | 显示全部楼层 |阅读模式
本帖最后由 CHEARV 于 2013-11-22 11:36 编辑

假如我写了两个Au3程序 A 和 B,在同时运行。 有什么好的办法让他们之间交换数据吗? 比方说,我在A程序中有一个数组,需要交给B程序处理,处理完成后再交回给A程序。
      目前我的构思是, A程序把要处理的数组转换成字符串,然后输出成一个临时文件1。 B程序则设置一段循环,不断扫描临时文件1,一旦出现就读入他,然后处理。处理完之后同样再输出另一个临时文件2,A最后再读回这个临时文件2。但觉得这样反复写文件有些麻烦,后来又重新构思了一下。
     第二种方法是,在B程序中创建两个文本控件。 A程序把需要处理的数组转换成字符串,通过ControlSetText 函数把他输入到B程序的控件1文本,再由B程序处理,处理完之后B程序再修改第二个控件的文本,然后由A程序通过 ControlGetText 函数读回来。
    第二种方法不需要写临时文件,没那么麻烦,但担心数组大了不好操作。
    大家有没有什么更好的方法呢?最好是能直接操作数组。
     不需要大家给源代码,先给我个思路吗,我自己去逐磨一下。但对于嵌入汇编或者多线程的解决方法就先不要了,因为我水平较低,理解不了。
发表于 2013-11-21 11:21:24 | 显示全部楼层
用个配置文件,写入两个字段,一个给A写B读,另一个B写A读。
 楼主| 发表于 2013-11-21 13:14:41 | 显示全部楼层
回复 2# haijie1223


    我之前也是这样想的,但数据交换很频繁的,我想最好是有能直接访问数据的,而不是需要这种中介。
发表于 2013-11-21 15:10:30 | 显示全部楼层
这样也行;要访问内存了;
发表于 2013-11-21 16:32:46 | 显示全部楼层
回复 3# CHEARV
这个应该是最简单的方法了吧,你肯定嫌临时文件碍事,写进TEMP里然后删除就是了,眼不见为净,就当我跨程序操作了
 楼主| 发表于 2013-11-21 19:57:43 | 显示全部楼层
回复 5# 天芯蓝影


      不是,我之前有这样试过,但我数据交换的频率很高,每秒钟都要处理一次,这样就造成硬盘一直工作,不太好。如果不行,那就只能试试我说的第二种方法了,通过控件交换。
      控件操作有没有什么不好,暂时还不知道。不过最好是通过内存操作,那样快,但不知道这样的方法在AU3上面能否实现。
 楼主| 发表于 2013-11-21 20:17:06 | 显示全部楼层
刚刚想到了,如果能为两个程序单独设立两块剪贴板也不错,或者利用系统环境变量。不知道会不会有什么限制,先去查查资料吧。
发表于 2013-11-21 20:31:17 | 显示全部楼层
本帖最后由 风行者 于 2013-11-21 20:34 编辑

两个窗口程序可以考虑使用wm_copydata消息
 楼主| 发表于 2013-11-21 20:35:48 | 显示全部楼层
回复 8# 风行者


    谢谢,不过,我在论坛上和帮助文档里都没有找到WM_SendCopyData的相关信息哦。
发表于 2013-11-21 21:55:36 | 显示全部楼层
本帖最后由 风行者 于 2013-11-21 22:10 编辑

写个小例子

发送消息A窗口
#include <SendMessage.au3>
Global Const $WM_COPYDATA = 0x4A
$Form1 = GUICreate("A窗口")
$button = GUICtrlCreateButton("发送",100,100,100,30)
GUISetState()

While 1
        Local $msg = GUIGetMsg()
        Switch $msg
                Case -3
                        Exit
                Case $button
                        Local $hwnd = WinGetHandle("B窗口")
                        _SendCopyData($hwnd,"发送的消息send!")
        EndSwitch
WEnd

Func _SendCopyData($hwnd, $data) ;发送消息
        Local $len = BinaryLen(StringToBinary($data))*2
        Local $tagCOPYDATASTRUCT = DllStructCreate( _
                        "DWORD dwData;" & _
                        "DWORD cbData;" & _
                        "ptr lpData;")
        
        Local $lpdata = DllStructCreate("wchar lpData["&$len&"]")
        DllStructSetData($lpdata,1,$data)
        DllStructSetData($tagCOPYDATASTRUCT,1,0)
        DllStructSetData($tagCOPYDATASTRUCT,2,$len)
        DllStructSetData($tagCOPYDATASTRUCT,3,DllStructGetPtr($lpdata))
        _SendMessage($hwnd, $WM_COPYDATA, 0,DllStructGetPtr($tagCOPYDATASTRUCT))
EndFunc   ;==>_SendCopyData


接收消息B窗口
#include <GUIConstants.au3>
Global Const $WM_COPYDATA = 0x4A

GUICreate('B窗口')
GUISetState()
GUIRegisterMsg($WM_COPYDATA, "WM_COPYDATA")

Do
Until GUIGetMsg()=-3

Func WM_COPYDATA($hWnd, $wMsg, $wParam, $wlParam)
        Local $SSS = "DWORD dwData;DWORD cbData;ptr lpData;"
        Local $struct = DllStructCreate($SSS, $wlParam)
        Local $CopyData = DllStructGetData($struct, 3) ;第三个元素是数据的指针
        Local $len = DllStructGetData($struct,2)
        Local $copy = "wchar str["&$len&"]" ;发送内容的数据结构
        Local $data = DllStructCreate($copy, $CopyData)
        Local $str = DllStructGetData($data,"str") ;返回的内容
        MsgBox(64,"接收到的消息",$str)
EndFunc   ;==>WM_COPYDATA

评分

参与人数 1金钱 +30 收起 理由
haijie1223 + 30 厉害~

查看全部评分

 楼主| 发表于 2013-11-22 11:35:13 | 显示全部楼层
太棒了,虽然我对WINDOWS的消息处理是门外汉,但这代码可以直接移植过来用,非常感谢。
发表于 2016-7-20 11:18:24 | 显示全部楼层
接收消息B窗口,运行之后,提示:
error: $WM_COPYDATA 上一次定义为一个 'Const' 变量..
Global $WM_COPYDATA = 0x4A
~~~~~~~~~~~~~~~~~~~~~~~~~~^

请问是什么情况?版本不兼容?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-18 06:20 , Processed in 0.088772 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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