Что нового

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

kaster

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

Yashied

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

P.S

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

kaster

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
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,724

CreatoR

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

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

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
Структуры не передает.

Структура - это область выделенной памяти в пределах процесса. Естественно, часть памяти нельзя передать в другой процесс, только данные. А массивы передает?
 

CreatoR

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

Yashied

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

Yashied

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

Garrett, Kaster

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

:ninja:
 
Автор
kaster

kaster

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
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,724
Kaster сказал(а):
...ссылку на самого себя передать можно, но использовать нельзя.

DllStructGetPtr() возвращает указатель на область памяти в пределах процесса, по которому находится структура. Конечно, мы можем передать этот указатель другому процессу (это просто число), но вот доступ к памяти первого процесса, второй процесс не получит и, соответственно, структуру прочесть не сможет.
 

madmasles

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

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

kaster

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