Что нового

Еще один способ итеракции процессов

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Собственно пример взят непосредственно из WinAPIEx.au3. На мой взгляд, это один из самых простых способов обмена данными между процессами.

Код:
#NoTrayIcon

#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)
Opt('WinWaitDelay', 0)

Global Const $Title = '_WinAPI_MapViewOfFile' & ChrW(160)

If Not $CmdLine[0] Then
	If WinExists($Title) Then
		Exit
	EndIf
	For $i = 1 To 2
		If Not @compiled Then
			Run(@AutoItExe & ' "' & @ScriptFullPath & '" /' & $i)
		Else
			Run(@AutoItExe & ' /' & $i)
		EndIf
		Sleep(500)
	Next
	Exit
EndIf

Opt('TrayIconHide', 0)

Switch $CmdLine[1]
	Case '/1'
		_Sender()
	Case '/2'
		_Receiver()
	Case Else
		Exit
EndSwitch

Func _Receiver()

	Local $hMapping, $pAddress, $tData, $Text

	$hMapping = _WinAPI_OpenFileMapping('MyFileMapping')
	If @error Then
		Return
	EndIf

	$pAddress = _WinAPI_MapViewOfFile($hMapping)
	$tData = DllStructCreate('wchar[1024]', $pAddress)
	While WinWait($Title, '', 1)
		Sleep(200)
		$Text = DllStructGetData($tData, 1)
		DllStructSetData($tData, 1, '')
		If $Text Then
			MsgBox(64, $Title, $Text)
		EndIf
	WEnd
	_WinAPI_UnmapViewOfFile($pAddress)
	_WinAPI_CloseHandle($hMapping)
EndFunc   ;==>_Receiver

Func _Sender()

	Local $hMapping, $pAddress, $tData, $Text

	$hMapping = _WinAPI_CreateFileMapping(-1, 2048, 'MyFileMapping')
	If (@error) Or (@extended) Then
		MsgBox(16, 'Error', 'Unable to create file mapping.')
		Return
	EndIf

	$pAddress = _WinAPI_MapViewOfFile($hMapping)
	$tData = DllStructCreate('wchar[1024]', $pAddress)
	While WinWaitClose($Title)
		$Text = StringStripWS(InputBox($Title, 'Type some text message.', '', '', -1, 171), 3)
		If Not $Text Then
			ExitLoop
		EndIf
		DllStructSetData($tData, 1, $Text)
		If Not WinWait($Title, '', 1) Then
			ExitLoop
		EndIf
	WEnd
	_WinAPI_UnmapViewOfFile($pAddress)
	_WinAPI_CloseHandle($hMapping)
EndFunc   ;==>_Sender
 

Luke

Знающий
Сообщения
64
Репутация
14
Надо будет почаще скачивать WinAPIEx.au3 , в старой версии этих функций небыло, приходилось делать через DllCall, спасибо. Для полноты просьба добавить функции синхронизации типа OpenEvent() и т.п.
 

mrsoros

Новичок
Сообщения
19
Репутация
0
Что бы работало надо обязательно чтобы у обоих процессов был один родитель? Хочу обмениваться сообщениями между двумя скриптами. Не получается написать клиента и сервер.
 
Верх