Автор Тема: Обмен данными между процессами  (Прочитано 16400 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем привет. Недавно в очередной раз всплыла тема про передачу данных между процессами. И хотя уже существуют парочка способов, а-ля стандартный поток, отдельный файл и буфер обмена, натолкнулся на такой очень интересный способ чем-то схожий с буфером, но более богатый в возможностях способ на дружеском ресурсе.
WSH: обмен данными и объектами между скриптами — 2
Осталось разобраться, что делать с классами и методами. По идее это всего лишь функции, которые надо будет немного по особому вызывать.
Неплохо было бы услышать мнения пользователей знающих  VBS/VBA/WSH о том, как лучше это реализовать посредством процедурных методов и адаптировать эти способы под AutoIt
« Последнее редактирование: Март 26, 2011, 00:17:46 от Kaster »
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Русское сообщество AutoIt

Обмен данными между процессами
« Отправлен: Март 24, 2011, 01:39:37 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #1, Отправлен: Март 24, 2011, 04:27:08 »
Использовать COM, да еще недокументированный, для обмена данными IMHO не самая лучшая идея. По мне, так лучше WM_COPYDATA или "Mapping Files".

P.S

Здается мне, что в AutoIt это не получится реализовать. Как создать экземпляр объекта? Если только прикрутить AutoItObject...
« Последнее редактирование: Март 24, 2011, 04:34:49 от Yashied »


Думай, прежде чем говорить.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020

  • Автор темы
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Обмен данными между процессами
« Ответ #2, Отправлен: Март 24, 2011, 05:17:08 »
Хм. WM_COPYDATA - это то же что и с буфером? а вот по поводу mapping довольно интересно. надо как нибудь почитать. но все же, все эти способы позволяют передавать значения именованных переменных асинхронно? ну то есть поместил в контейнер несколько параметров, а с другого процесса получаешь к ним доступ независимо от того, в какой очередности они туда были положены. посредством буфера такого точно не достигнуть.
а по поводу экземпляра, то в классе описаны функция установления и извлечения данных в контейнере. наверняка это можно реализовать на процедурном уровне.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808
  • Репутация: 2280
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Обмен данными между процессами
« Ответ #3, Отправлен: Март 24, 2011, 15:45:37 »
Yashied  [?]
Цитировать
Как создать экземпляр объекта?
:blink: Очень просто:
Код: AutoIt [Выделить]
$oGlobalObj = OpenContainer() ;тут функция возвращающая объект


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

1.au3
Код: AutoIt [Выделить]
$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
Код: AutoIt [Выделить]
$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



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #3 Отправлен: Март 24, 2011, 15:45:37 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #4, Отправлен: Март 24, 2011, 15:51:36 »
:blink:

Я не такой знаток COM, поэтому и не утверждал точно... Но пример хороший.

:)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808
  • Репутация: 2280
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Обмен данными между процессами
« Ответ #5, Отправлен: Март 24, 2011, 16:06:41 »
До меня только что дошло, можно же целые массивы таким образом передавать :laugh:, а возможно и структуры/указатели (не проверял):

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

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


Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3902
  • Репутация: 957
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Обмен данными между процессами
« Ответ #6, Отправлен: Март 24, 2011, 16:18:39 »
Kaster  [?]
Цитировать
И хотя уже существуют парочка способов а-ля стандартный поток
STDIN / STDOUT - а-ля стандартный поток?  :blink:

Скорблю и помню.




Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2313
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #7, Отправлен: Март 24, 2011, 16:49:48 »
CreatoR  [?]
Цитировать
а возможно и структуры
Структуры не передает.  :(

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #7 Отправлен: Март 24, 2011, 16:49:48 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #8, Отправлен: Март 24, 2011, 17:53:23 »
Структуры не передает.

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

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2313
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #9, Отправлен: Март 24, 2011, 18:44:03 »
Yashied  [?]
Цитировать
А массивы передает?
Передает.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808
  • Репутация: 2280
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Обмен данными между процессами
« Ответ #10, Отправлен: Март 24, 2011, 20:15:45 »
madmasles  [?]
Цитировать
Структуры не передает
Да, скрипт терпит крушение с ошибкой «... память не можеть быть "read"» при попытке обращение к структуре другого процесса (через указатель) :(.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #11, Отправлен: Март 24, 2011, 20:19:20 »
«... память не можеть быть "read"»

;D

Хорошее выражение.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808
  • Репутация: 2280
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Обмен данными между процессами
« Ответ #12, Отправлен: Март 24, 2011, 20:32:17 »
Yashied  [?]
Цитировать
Хорошее выражение
Это не я придумал :whistle::

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #13, Отправлен: Март 24, 2011, 20:37:08 »
Это не я придумал.

Именно поэтому я и не пользуюсь руссифицированным софтом.

:)

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2693
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Обмен данными между процессами
« Ответ #14, Отправлен: Март 25, 2011, 09:28:45 »
Я удалил все последующие сообщения.

Garrett, Kaster

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

:ninja:

Русское сообщество AutoIt

Re: Обмен данными между процессами
« Ответ #14 Отправлен: Март 25, 2011, 09:28:45 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
10797 Просмотров
Последний ответ Сентябрь 24, 2010, 12:49:37
от LapaM
3 Ответов
2536 Просмотров
Последний ответ Август 23, 2010, 12:24:57
от axlwor
5 Ответов
4119 Просмотров
Последний ответ Март 24, 2011, 01:26:56
от Kaster
0 Ответов
1706 Просмотров
Последний ответ Март 24, 2011, 01:42:29
от Kaster
4 Ответов
3878 Просмотров
Последний ответ Март 22, 2017, 14:11:44
от mrsoros
2 Ответов
2597 Просмотров
Последний ответ Октябрь 12, 2012, 16:07:32
от ---Zak---
0 Ответов
1934 Просмотров
Последний ответ Октябрь 20, 2013, 21:56:17
от inververs
8 Ответов
3146 Просмотров
Последний ответ Июнь 26, 2014, 16:21:37
от joiner
1 Ответов
1516 Просмотров
Последний ответ Март 22, 2016, 09:53:23
от mmsgeorge
6 Ответов
700 Просмотров
Последний ответ Декабрь 28, 2016, 20:08:18
от SNAK