Что нового

Обмен данными между процессами

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Всем привет. Недавно в очередной раз всплыла тема про передачу данных между процессами. И хотя уже существуют парочка способов, а-ля стандартный поток, отдельный файл и буфер обмена, натолкнулся на такой очень интересный способ чем-то схожий с буфером, но более богатый в возможностях способ на дружеском ресурсе.
WSH: обмен данными и объектами между скриптами — 2
Осталось разобраться, что делать с классами и методами. По идее это всего лишь функции, которые надо будет немного по особому вызывать.
Неплохо было бы услышать мнения пользователей знающих VBS/VBA/WSH о том, как лучше это реализовать посредством процедурных методов и адаптировать эти способы под AutoIt
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Использовать COM, да еще недокументированный, для обмена данными IMHO не самая лучшая идея. По мне, так лучше WM_COPYDATA или "Mapping Files".

P.S

Здается мне, что в AutoIt это не получится реализовать. Как создать экземпляр объекта? Если только прикрутить AutoItObject...
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Хм. WM_COPYDATA - это то же что и с буфером? а вот по поводу mapping довольно интересно. надо как нибудь почитать. но все же, все эти способы позволяют передавать значения именованных переменных асинхронно? ну то есть поместил в контейнер несколько параметров, а с другого процесса получаешь к ним доступ независимо от того, в какой очередности они туда были положены. посредством буфера такого точно не достигнуть.
а по поводу экземпляра, то в классе описаны функция установления и извлечения данных в контейнере. наверняка это можно реализовать на процедурном уровне.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 331
Yashied [?]
Как создать экземпляр объекта?
:blink: Очень просто:
Код:
$oGlobalObj = OpenContainer() ;тут функция возвращающая объект


Вот переделал с vbs в AutoIt (вместо класса и его методов, я просто использовал функций):

1.au3
Код:
$oContainer = OpenContainer("storage")
PutProperty($oContainer, "test", InputBox('', 'Введите значение для глобальной переменной "test".'))
$oFSO = ObjCreate("Scripting.FileSystemObject")
PutProperty($oContainer, "fso", $oFSO)

MsgBox(64, "", "Значения установлены. Теперь, не закрывая это сообщение, запустите 2.au3")

Func OpenContainer($sName)
	Local $oShell, $oShellWindow, $oShellWindows
	$oShell = ObjCreate("Shell.Application")
	$oShellWindows = $oShell.Windows
	
	For $oShellWindow In $oShellWindows
		If StringInstr($oShellWindow.StatusText, $sName) Then
			Return $oShellWindow
		EndIf
	Next
	
	$oContainer = ObjGet("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
	$oContainer.StatusText = $sName
	
	Return $oContainer
EndFunc

Func PutProperty($oContainer, $sName, $vValue)
	$oContainer.PutProperty($sName, $vValue)
EndFunc

Func GetProperty($oContainer, $sName)
	Return $oContainer.GetProperty($sName)
EndFunc


2.au3
Код:
$oContainer = OpenContainer("storage")

MsgBox(64, '', "Значение переменной ""test"": " & GetProperty($oContainer, "test"))
MsgBox(64, '', "Тип переменной ""fso"": " & VarGetType(GetProperty($oContainer, "fso")))

Func OpenContainer($sName)
	Local $oShell, $oShellWindow, $oShellWindows
	$oShell = ObjCreate("Shell.Application")
	$oShellWindows = $oShell.Windows
	
	For $oShellWindow In $oShellWindows
		If StringInstr($oShellWindow.StatusText, $sName) Then
			Return $oShellWindow
		EndIf
	Next
	
	$oContainer = ObjGet("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
	$oContainer.StatusText = $sName
	
	Return $oContainer
EndFunc

Func PutProperty($oContainer, $sName, $vValue)
	$oContainer.PutProperty($sName, $vValue)
EndFunc

Func GetProperty($oContainer, $sName)
	Return $oContainer.GetProperty($sName)
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 331
До меня только что дошло, можно же целые массивы таким образом передавать :laugh:, а возможно и структуры/указатели (не проверял):

Код:
;Отправка данных
$avArray = StringSplit('AutoIt is the Best!', ' ')
PutProperty($oContainer, "arr", $avArray)

;Получение данных
$avArr = GetProperty($oContainer, "arr")
MsgBox(64, '', 'Значение переменной "arr[1]": ' & $avArr[1])
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
963

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
madmasles сказал(а):
Структуры не передает.
Структура - это область выделенной памяти в пределах процесса. Естественно, часть памяти нельзя передать в другой процесс, только данные. А массивы передает?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 331
madmasles [?]
Структуры не передает
Да, скрипт терпит крушение с ошибкой «... память не можеть быть "read"» при попытке обращение к структуре другого процесса (через указатель) :(.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Я удалил все последующие сообщения.

Garrett, Kaster

Если хотите продолжить ваш "спор", то пожалуйста через ЛС. Я думаю, что другим будет малоинтересно читать все это.

:ninja:
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
CreatoR
я отписался в той теме, снабдив пост твоими кодами, чтобы до кучи было в общей коллекции
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
madmasles [?]
Структуры не передает.
тут знающие люди сказали, что передать можно практически все что угодно, в том числе и структуры и указатели и прочее. единственное, ссылку на самого себя передать можно, но использовать нельзя. я пока не совсем представляю смысл этих слов.
и еще, в той же теме отписался человек и предложил COM для... внимание... барабанная дробь... многопоточности! вот краткая выдержка
[box title=COMScriptThread]
Name Description
Start Starts the thread with the given script
Execute If the thread is started and in stand-by executes the given routine from the loaded script.
Stop Stops the thread.
Wait Waits for the thread to complete the current operation.
Value Default property: Holds a VarDictionary based collection (dictionary) that is accessible for the both - the application creating the thread and the script in the thread.
Busy Boolean: indicates if the thread is busy.
AddCreator Boolean: If set the running script in the thread will have a Pack1Creator object accessible through the Creator namespace.
LastError String: Contains the last error
MultiThreaded Boolean: If set (default) the thread will be initialized as multithreaded COM apartment.
Priority Integer: The thread priority
Result Variant: The result of the last routine execution (meaningful if the routine is a function)
Success Boolean: Indicates if the last operation was successful (routine execution, thread start)
Timeout Positive integer: Timeout for the internal wait operations.
Active Indicates if the thread is active (Busy or stand by)
[/box]
что примечательно, в либе есть функция которая добавляет Creator. я думаю, на всякий случай, если одного вдруг будет недостаточно :rofl:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Kaster сказал(а):
...ссылку на самого себя передать можно, но использовать нельзя.
DllStructGetPtr() возвращает указатель на область памяти в пределах процесса, по которому находится структура. Конечно, мы можем передать этот указатель другому процессу (это просто число), но вот доступ к памяти первого процесса, второй процесс не получит и, соответственно, структуру прочесть не сможет.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Kaster [?]
в той же теме отписался человек и предложил COM
Там все на английском, а я с ним, увы, не дружу... :(
Но функция AddCreator понравилась. Хорошая функция. ;D

PS
Хорошо, что там нет функции DeleteCreator. :rofl:
 
Автор
kaster

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Yashied
ну, посмотрим, что он наваяет. возможно, это недостаток исключительно AutoIt, которые не умеет напрямую создавать указатели на переменные.
madmasles [?]
Там все на английском, а я с ним, увы, не дружу...
Вот перевод гугла - Перевод
 
Верх