CHEARV 发表于 2013-11-21 10:44:30

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

本帖最后由 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 函数读回来。
    第二种方法不需要写临时文件,没那么麻烦,但担心数组大了不好操作。
    大家有没有什么更好的方法呢?最好是能直接操作数组。
   不需要大家给源代码,先给我个思路吗,我自己去逐磨一下。但对于嵌入汇编或者多线程的解决方法就先不要了,因为我水平较低,理解不了。

haijie1223 发表于 2013-11-21 11:21:24

用个配置文件,写入两个字段,一个给A写B读,另一个B写A读。

CHEARV 发表于 2013-11-21 13:14:41

回复 2# haijie1223


    我之前也是这样想的,但数据交换很频繁的,我想最好是有能直接访问数据的,而不是需要这种中介。

wilask 发表于 2013-11-21 15:10:30

这样也行;要访问内存了;

天芯蓝影 发表于 2013-11-21 16:32:46

回复 3# CHEARV
这个应该是最简单的方法了吧,你肯定嫌临时文件碍事,写进TEMP里然后删除就是了,眼不见为净,就当我跨程序操作了

CHEARV 发表于 2013-11-21 19:57:43

回复 5# 天芯蓝影


      不是,我之前有这样试过,但我数据交换的频率很高,每秒钟都要处理一次,这样就造成硬盘一直工作,不太好。如果不行,那就只能试试我说的第二种方法了,通过控件交换。
      控件操作有没有什么不好,暂时还不知道。不过最好是通过内存操作,那样快,但不知道这样的方法在AU3上面能否实现。

CHEARV 发表于 2013-11-21 20:17:06

刚刚想到了,如果能为两个程序单独设立两块剪贴板也不错,或者利用系统环境变量。不知道会不会有什么限制,先去查查资料吧。

风行者 发表于 2013-11-21 20:31:17

本帖最后由 风行者 于 2013-11-21 20:34 编辑

两个窗口程序可以考虑使用wm_copydata消息

CHEARV 发表于 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

CHEARV 发表于 2013-11-22 11:35:13

太棒了,虽然我对WINDOWS的消息处理是门外汉,但这代码可以直接移植过来用,非常感谢。

godhawk 发表于 2016-7-20 11:18:24

接收消息B窗口,运行之后,提示:
error: $WM_COPYDATA 上一次定义为一个 'Const' 变量..
Global $WM_COPYDATA = 0x4A
~~~~~~~~~~~~~~~~~~~~~~~~~~^

请问是什么情况?版本不兼容?
页: [1]
查看完整版本: [已解决]请教,两个正在运行的AU3程序如何交换数据?