找回密码
 加入
搜索
楼主: tubaba

[原创] 进程间的七种通信方式

[复制链接]
 楼主| 发表于 2022-5-23 10:02:52 | 显示全部楼层
当然,在处理收到的消息,也要用BinaryToString($vParameter, 4)进行还原
发表于 2022-5-23 10:31:33 | 显示全部楼层
tubaba 发表于 2022-5-23 09:48
在用前辈研发的UDF函数时,可以仔细查看UDF的写法思路,这样才会提高自己的编程水平,如果你仔细研究copr ...

大佬你太强了。我看过这个函数,但是几乎看不懂,特别遇到DllStructCreate,不明白创建结构如何理解,看来得好好研究一下数据结构了。
发表于 2022-5-25 17:15:58 | 显示全部楼层
本帖最后由 smooth 于 2022-5-25 17:18 编辑
tubaba 发表于 2022-5-23 10:02
当然,在处理收到的消息,也要用BinaryToString($vParameter, 4)进行还原

请教一下,发送消息的时候,为何要创建两个数据结构,我看着感觉创建一个数据结构,就可以把数据传递过去了,但是我没搞成。

  1. ;父进程向子进程发送消息
  2. Func _SendData($hWndTarget, $sData) ;$hWndTarget:子进程窗口句柄。
  3.      Local $msg = StringToBinary($sData, 4)  ;转换字符串为二进制数据,格式为UTF8 编码。参数4:字符串数据为 UTF8 编码

  4.      Local $MyData = DllStructCreate("byte[" & BinaryLen($msg) & "]")  ;BinaryLen:返回二进制变量的字节数。byte:8 位(1字节) 无符号字符. UTF-8 编码单位. "汉字"的 UTF-8 编码需要6个字节.
  5.      Local $COPYDATA = DllStructCreate("ptr;dword;ptr")

  6.      DllStructSetData($MyData, 1, $msg)  ;设置数据结构元素的数据,第1个参数:结构变量,第2个参数:元素,第3个参数:值
  7.      DllStructSetData($COPYDATA, 1, 0)
  8.      DllStructSetData($COPYDATA, 2, DllStructGetSize($MyData))  ;返回数据结构的大小(字节)。
  9.      DllStructSetData($COPYDATA, 3, DllStructGetPtr($MyData))  ;返回数据结构指针.
  10.    
  11.      Local $aTmp = DllCall("user32.dll", "int", "SendMessageTimeout", "hwnd", $hWndTarget, "int", $WM_COPYDATA, "int", 0, "ptr", DllStructGetPtr($COPYDATA), "int", 0, "int", 1000, "long*", 0)  ; WM_COPYDATA:0x004A
  12. EndFunc   ;==>_SendData
复制代码


发表于 2022-5-27 14:15:36 | 显示全部楼层
tubaba 发表于 2022-5-20 16:44
先介绍第三种:消息队列MessageQueue

今天测试发现,如果如果传送的消息略频繁,比如半秒钟传递一次,则很容易(基本上确定会)导致消息堵塞,子进程卡死,导致程序无法正常工作。传递的消息并不大,编码格式为UTF8的BinaryLen长度,仅为44.
发表于 2022-5-27 14:46:33 | 显示全部楼层
tubaba 发表于 2022-5-23 09:48
在用前辈研发的UDF函数时,可以仔细查看UDF的写法思路,这样才会提高自己的编程水平,如果你仔细研究copr ...

我用了你修正后的函数,传递汉字时,变成乱码。
 楼主| 发表于 2022-5-31 09:55:22 | 显示全部楼层
smooth 发表于 2022-5-27 14:46
我用了你修正后的函数,传递汉字时,变成乱码。

我不知道你乱码是怎么产生的,WM_COPYDATA函数也是比较可靠的,还是那句话,有问题很正常,问题是怎么产生的,自己多思考,别人只能给你抛砖引玉,不会给你具体的代码实现




  1. #include <GuiEdit.au3>
  2. Global $My_Hwnd = GUICreate("WM_COPYDATA接收", 300, 600, @DesktopWidth / 2 - 300, Default, Default, 0x00000008)
  3. $ssss= GUICtrlCreateEdit('', 5,5,280,400)
  4. GUIRegisterMsg(0x004A, "WM_COPYDATA")
  5. GUISetState()
  6. Run(StringFormat('"%s" "%s" "%s"',@AutoItExe,@ScriptDir & '\WM_COPYDATA发送.au3',String($My_Hwnd)))


  7. Do
  8. Until GUIGetMsg() = -3



  9. Func WM_COPYDATA($hWnd, $Msg, $wParam, $lParam)
  10.         #forceref $hWnd, $Msg, $wParam, $lParam
  11.         Local $COPYDATA, $tMyData, $MyData
  12.         $COPYDATA = DllStructCreate("ptr;dword;ptr", $lParam)
  13.         $tMyData = DllStructCreate("byte[" & DllStructGetData($COPYDATA, 2) & "]", DllStructGetData($COPYDATA, 3))
  14.         $MyData = BinaryToString(DllStructGetData($tMyData, 1), 4)
  15.         _GUICtrlEdit_AppendText($ssss, $MyData & @CRLF)
  16.         Return
  17. EndFunc   ;==>WM_COPYDATA
复制代码



  1. #include <GuiEdit.au3>
  2. Global $hWndTarget
  3. Global $WM_COPYDATA = 0x004A
  4. If $cmdline[0] = 1 Then
  5. $hWndTarget = HWnd($cmdline[1])
  6. Else
  7.         Exit MsgBox(0,1,'请先运行接收端')
  8. EndIf
  9. Global $My_Hwnd = GUICreate("WM_COPYDATA发送", 300, 600,  @DesktopWidth / 2 + 5, Default, Default, 0x00000008)
  10. $ssss= GUICtrlCreateEdit('', 5,5,280,400)

  11. $bbbb = GUICtrlCreateButton('请直接点击', 10, 450, 100, 30)

  12. GUISetState()


  13. While 1
  14.         $msg = GUIGetMsg()
  15.         Switch $msg
  16.                 Case -3
  17.                         Exit
  18.                 Case $bbbb

  19.                         For $i = 129 To 131
  20.                                 For $j = 64 To 254
  21.                                         Local $code = Hex($i, 2) & Hex($j, 2)
  22.                                         Local $str = BinaryToString('0x' & $code)
  23.                                         If $j <> 127 Then _GUICtrlEdit_AppendText($ssss, '"' & $str & '","' & $code & '"')
  24.                                         SendData($hWndTarget, '"' & $str & '","' & $code & '"')
  25.                                 Next
  26.                                 If $i <> 87 Then _GUICtrlEdit_AppendText($ssss, @CRLF)
  27.                                 SendData($hWndTarget, @CRLF)       
  28.                         Next


  29.         EndSwitch
  30. WEnd


  31. Func SendData($hWndTarget, $sData)
  32.                 Local $msg = StringToBinary($sData, 4)
  33.                 Local $MyData = DllStructCreate("byte[" & BinaryLen($msg) & "]")
  34.                 Local $COPYDATA = DllStructCreate("ptr;dword;ptr")
  35.                 DllStructSetData($MyData, 1, $msg)
  36.                 DllStructSetData($COPYDATA, 1, 0)
  37.                 DllStructSetData($COPYDATA, 2, DllStructGetSize($MyData))
  38.                 DllStructSetData($COPYDATA, 3, DllStructGetPtr($MyData))
  39.                
  40.                 Local $aTmp = DllCall("user32.dll", "int", "SendMessageTimeout", "hwnd", $hWndTarget, "int", $WM_COPYDATA _ ; WM_COPYDATA
  41.                                 , "int", 0, "ptr", DllStructGetPtr($COPYDATA), "int", 0, "int", 1000, "long*", 0)
  42. EndFunc   ;==>SendSciTE_Command
复制代码



 楼主| 发表于 2022-5-31 09:58:49 | 显示全部楼层
smooth 发表于 2022-5-25 17:15
请教一下,发送消息的时候,为何要创建两个数据结构,我看着感觉创建一个数据结构,就可以把数据传递过去 ...

因为copydata就是这个结构啊,这是官方定义的
发表于 2024-9-14 21:52:32 | 显示全部楼层
Systemizer谢谢楼主
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2026-9-23 14:15 , Processed in 0.063954 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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