[已解决]请教,两个正在运行的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 函数读回来。
第二种方法不需要写临时文件,没那么麻烦,但担心数组大了不好操作。
大家有没有什么更好的方法呢?最好是能直接操作数组。
不需要大家给源代码,先给我个思路吗,我自己去逐磨一下。但对于嵌入汇编或者多线程的解决方法就先不要了,因为我水平较低,理解不了。 用个配置文件,写入两个字段,一个给A写B读,另一个B写A读。 回复 2# haijie1223
我之前也是这样想的,但数据交换很频繁的,我想最好是有能直接访问数据的,而不是需要这种中介。 这样也行;要访问内存了; 回复 3# CHEARV
这个应该是最简单的方法了吧,你肯定嫌临时文件碍事,写进TEMP里然后删除就是了,眼不见为净,就当我跨程序操作了 回复 5# 天芯蓝影
不是,我之前有这样试过,但我数据交换的频率很高,每秒钟都要处理一次,这样就造成硬盘一直工作,不太好。如果不行,那就只能试试我说的第二种方法了,通过控件交换。
控件操作有没有什么不好,暂时还不知道。不过最好是通过内存操作,那样快,但不知道这样的方法在AU3上面能否实现。 刚刚想到了,如果能为两个程序单独设立两块剪贴板也不错,或者利用系统环境变量。不知道会不会有什么限制,先去查查资料吧。 本帖最后由 风行者 于 2013-11-21 20:34 编辑
两个窗口程序可以考虑使用wm_copydata消息 回复 8# 风行者
谢谢,不过,我在论坛上和帮助文档里都没有找到WM_SendCopyData的相关信息哦。 本帖最后由 风行者 于 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
太棒了,虽然我对WINDOWS的消息处理是门外汉,但这代码可以直接移植过来用,非常感谢。 接收消息B窗口,运行之后,提示:
error: $WM_COPYDATA 上一次定义为一个 'Const' 变量..
Global $WM_COPYDATA = 0x4A
~~~~~~~~~~~~~~~~~~~~~~~~~~^
请问是什么情况?版本不兼容?
页:
[1]