Что нового

Container - Библиотека для интеракций между скриптами

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AutoIt: 3.3.6.1 - 3.3.12.0
Версия: 1.3

Категория: Интеракция

Описание: Ещё один метод интеракции между скриптами. Отличительное качество данного метода, это возможность передачи целого массива данных (Array), а также COM-объектов и указателей структуры.

Системные требования: Win 2000+, IE 7+(?).

Пример:
[SENDER] - Interaction Demo.au3 (отправка данных) - Запускать первым
Код:
#include <Container.au3>

$sVar = "Test"
$sValue = InputBox('Container', 'Please type a value for "' & $sVar & '" variable:')
If @error Then Exit

$oFSO = ObjCreate("Scripting.FileSystemObject")
$avArray = StringSplit('AutoIt is the Best!', ' ')

$oContainer = _Container_Open("storage", 1)

_Container_PutProperty($oContainer, $sVar, $sValue)
_Container_PutProperty($oContainer, "FSO", $oFSO)
_Container_PutProperty($oContainer, "Array", $avArray)

MsgBox(64, "Container", "Values are set. Now, before closing this message, open: [RECIEVER] - Interaction Demo.au3")

_Container_Close($oContainer)


[RECIEVER] - Interaction Demo.au3 (получение данных)
Код:
#include <Container.au3>

$oContainer = _Container_Open("storage", 0)

If @error Then
	MsgBox(48, 'Container', '_Container_Open() failed!')
	Exit
EndIf

$vTestVar_Value = _Container_GetProperty($oContainer, "Test")
$vFSOVar_Value = _Container_GetProperty($oContainer, "FSO")
$aArrayVar_Value = _Container_GetProperty($oContainer, "Array")

MsgBox(64, 'Container', '"Test" variable value: ' & $vTestVar_Value)
MsgBox(64, 'Container', '"FSO" variable type: ' & VarGetType($vFSOVar_Value))
MsgBox(64, 'Container', '"Array" variable type: ' & VarGetType($aArrayVar_Value))
MsgBox(64, 'Container', '"Array[1]" variable value: ' & $aArrayVar_Value[1])

Файл: Container.zip

История версий:
v1.3
* Убрана проверка "Ptr" для AutoIt версий выше 3.3.7.9 (изменена глобальная переменная $bContainer_CheckPtrVal).
* Изменён пример "...Structs Transfer" - закрытие дескриптора открытого процесса.

v1.2
* Убрана проверка версий IE. Теперь используется "InternetExplorer.Application", это должно решить проблему с версией IE.
* Исправление (временное) проблемы с передачей переменной типа "ptr" (указатель) через COM-интерфейс (тикет #1410).
Однако это „исправление“ задаёт ограничение на размерность массива при использовании в _Container_PutProperty/GetProperty, поддерживает только двухмерный массив.
Это „исправление“ можно отключить, задав глобальной переменной $bContainer_CheckPtrVal значение False.
* Добавлен пример передачи указателя структуры, и последующего чтения данной структуры из другого скрипта (процесса).

v1.1
* Добавлена проверка версий IE. Эта библиотека требует IE 7 (и windows 2000+).
* Улучшена обработка ошибок.

v1.0
Первая версия.

Источник: www.autoit-script.ru (тема зарождения библиотеки)
Автор(ы): G.Sandler (CreatoR)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Небольшое обновление:

v1.1
* Добавлена проверка версий IE. Эта библиотека требует IE 7 (и windows 2000+).
* Улучшена обработка ошибок.
 

running-frag

why me?
Сообщения
441
Репутация
60
уточни пожалуста сис. требования, у меня win7 x64 + IE8
SENDER выполнен успешно (без ошибок)
RECIEVER выполнен с ошибкой (MsgBox(48, 'Container', '_Container_Open() failed!'))

ps: пробывал 1.1 версию


upd:
работает всё, ошибка была в следующем:
1. нужно было скомпилить SENDER и запустить (не как дэбаг а как отдельный ехе)
2. из под редактора запускаем RECIEVER

сходу не разобрался, но есть ещё вопрос такой, как быстро можно через этот "канал" пропускать данные? к примеру каждые 100мс не будет много?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление:

[1.2]
* Убрана проверка версий IE. Теперь используется "InternetExplorer.Application", это должно решить проблему с версией IE.
* Исправление (временное) проблемы с передачей переменной типа "ptr" (указатель) через COM-интерфейс (тикет #1410).
Однако это „исправление“ задаёт ограничение на размерность массива при использовании в _Container_PutProperty/GetProperty, поддерживает только двухмерный массив.
Это „исправление“ можно отключить, задав глобальной переменной $bContainer_CheckPtrVal значение False.
* Добавлен пример передачи указателя структуры, и последующего чтения данной структуры из другого скрипта (процесса).
 

running-frag

why me?
Сообщения
441
Репутация
60
и ещё вопрос, нужно ли закрывать контейнер если мы "читаем" (пример Reciever)?

upd:
и до какого момента живёт конейтнер при примере SENDER? т.е. если мы его закроем тогда всё что в контейнере "умрёт"?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
в функции _Container_Open() не обьявлена $oContainer
Это не критично, т.ч до следующего значительно обновления новой версий не будет :smile:

[?]
нужно ли закрывать контейнер если мы "читаем" (пример Reciever)?
По завершению передачи данных, один из процессов должен закрывать Container, не важно кто.

до какого момента живёт конейтнер при примере SENDER? т.е. если мы его закроем тогда всё что в контейнере "умрёт"?
Да, при закрытий данные удаляются.
 

running-frag

why me?
Сообщения
441
Репутация
60
CreatoR [?]
По завершению передачи данных, один из процессов должен закрывать Container, не важно кто.
получается можно создать вообще левый (вне sender & reciever) exe который будет инициализоровать создание и закрытие контейнера?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
running-frag [?]
получается можно создать вообще левый (вне sender & reciever) exe который будет инициализоровать создание и закрытие контейнера?
Какой в этом смысл?
Тем более что нужно же как то получать объект для использования контейнера.
 

YOgen

Знающий
Сообщения
58
Репутация
5
:stars: После смены внешнего вида форума совсем не вижу прикрепленного файла UDF.
Обновите, пожалуйста, первое сообщение.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Потерпите немного, я пытаюсь исправить проблему со старыми вложениями.
 

Olim98

Новичок
Сообщения
48
Репутация
2
YOgen сказал(а):
:stars: После смены внешнего вида форума совсем не вижу прикрепленного файла UDF.
Обновите, пожалуйста, первое сообщение.
Присоединяюсь, уже три месяца прошло, а все тишина :(
 

Olim98

Новичок
Сообщения
48
Репутация
2
Автор
CreatoR

CreatoR

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

Olim98

Новичок
Сообщения
48
Репутация
2
CreatoR
Большое спасибо!!!
UPD: Немного подправил скрипт
* Теперь нет ограничения на размерность массива и корректно передаются указатели
* Добавлено закрытие хэндла процесса в примере приема структуры
Можете добавить в шапку темы
 

Вложения

  • Container.zip
    4.4 КБ · Просмотры: 19
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Olim98 [?]
Можете добавить в шапку темы
Мне нужно знать какие конкретно участки кода были изменены, я не буду в слепую обновлять библиотеку не зная что там изменено.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
OffTopic:
CreatoR
пользуйся diff :smile: не думал, что сегодня им кто-то еще не пользуется ;D
 

Olim98

Новичок
Сообщения
48
Репутация
2
CreatoR сказал(а):
Мне нужно знать какие конкретно участки кода были изменены
Код:
--- D:/AutoIt/Container/Container (2).au3	Пт авг 22 22:32:04 2014
+++ D:/AutoIt/Container/Container.au3	Пт авг 22 22:32:04 2014
@@ -3,11 +3,15 @@
 #CS
 	Name:				Container UDF
 	Author:				Copyright © 2011-2012 CreatoR's Lab (G.Sandler), www.creator-lab.ucoz.ru, www.autoit-script.ru. All rights reserved.
-	AutoIt version:		3.3.6.1
-	UDF version:		1.2
+	AutoIt version:		3.3.10.0
+	UDF version:		1.3
 	Requiremets:		Windows 2000+, (?)Internet Explorer 7+(?).
 	
 	History:
+						[1.3]
+						* Теперь нет ограничения на размерность массива и корректно передаются указатели
+						* Добавлено закрытие хэндла процесса в примере приема структуры
+
 						[1.2]
 						* Removed IE version verification. Now used "InternetExplorer.Application", it should solve the IE version issue.
 						* Now the UDF fixes the issue with transfering "ptr" variable type via COM interface (ticket #1410).
@@ -32,10 +36,6 @@
 
 Global $oContainer_COMErr
 
-;Fixes the issue with transfering "ptr" via COM interface (ticket #1410).
-;Can be slow if $vValue is an array, and only 2D arrays are supported, so this "fix" sets an array limitation.
-Global $bContainer_CheckPtrVal = True
-
 #EndRegion Global Variables
 
 #Region Public Functions
@@ -65,11 +65,7 @@ Global $oContainer_COMErr
 ; ===============================================================================================================
 Func _Container_Open($sName, $iMode)
 	Local $oShell, $oShellWindow, $oShellWindows
-	
-	;If Int(StringLeft(FileGetVersion(@ProgramFilesDir & "\Internet Explorer\IExplore.exe"), 1)) < 7 Then
-	;	Return SetError(-1, 0, 0)
-	;EndIf
-	
 	If Not ObjEvent("AutoIt.Error") Then
 		$oContainer_COMErr = ObjEvent("AutoIt.Error", "__Container_COMErrHandler")
 	EndIf
@@ -95,8 +91,7 @@ Func _Container_Open($sName, $iMode)
 	If $iMode = 0 Then
 		Return SetError(1, 0, 0)
 	EndIf
-	
-	;$oContainer = ObjGet("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
 	$oContainer = ObjCreate("InternetExplorer.Application")
 	
 	If Not IsObj($oContainer) Then
@@ -126,9 +121,6 @@ EndFunc
 ; Example........:	
 ; ===============================================================================================================
 Func _Container_Close($oContainer)
-	;$oContainer_COMErr = 0
-	;$oContainer.StatusText = ''
-	
 	Local $iRet = 0
 	Local $hContainer = HWnd($oContainer.HWnd)
 	
@@ -158,32 +150,6 @@ EndFunc
 ; Example........:	
 ; ===============================================================================================================
 Func _Container_PutProperty($oContainer, $sVarName, $vValue)
-	If $bContainer_CheckPtrVal Then
-		If IsPtr($vValue) Then
-			$vValue = "__PTR_SIG_" & String($vValue)
-		ElseIf IsArray($vValue) Then
-			Local $iDims = UBound($vValue, 0)
-			
-			If $iDims > 2 Then
-				Return SetError(1)
-			EndIf
-			
-			For $i = 0 To UBound($vValue) - 1
-				If $iDims > 1 Then
-					For $j = 0 To UBound($vValue, 0) - 1
-						If IsPtr($vValue[$i][$j]) Then
-							$vValue[$i][$j] = "__PTR_SIG_" & String($vValue[$i][$j])
-						EndIf
-					Next
-				Else
-					If IsPtr($vValue[$i]) Then
-						$vValue[$i] = "__PTR_SIG_" & String($vValue[$i])
-					EndIf
-				EndIf
-			Next
-		EndIf
-	EndIf
-	
 	$oContainer.PutProperty($sVarName, $vValue)
 EndFunc
 
@@ -204,35 +170,7 @@ EndFunc
 ; Example........:	
 ; ===============================================================================================================
 Func _Container_GetProperty($oContainer, $sVarName)
-	Local $vValue = $oContainer.GetProperty($sVarName)
-	
-	If $bContainer_CheckPtrVal Then
-		If IsString($vValue) And StringLeft($vValue, 10) = "__PTR_SIG_" Then
-			$vValue = Ptr(StringTrimLeft($vValue, 10))
-		ElseIf IsArray($vValue) Then
-			Local $iDims = UBound($vValue, 0)
-			
-			If $iDims > 2 Then
-				Return SetError(1)
-			EndIf
-			
-			For $i = 0 To UBound($vValue) - 1
-				If $iDims > 1 Then
-					For $j = 0 To UBound($vValue, 0) - 1
-						If IsString($vValue[$i][$j]) And StringLeft($vValue[$i][$j], 10) = "__PTR_SIG_" Then
-							$vValue[$i][$j] = Ptr(StringTrimLeft($vValue[$i][$j], 10))
-						EndIf
-					Next
-				Else
-					If IsString($vValue[$i]) And StringLeft($vValue[$i], 10) = "__PTR_SIG_" Then
-						$vValue[$i] = Ptr(StringTrimLeft($vValue[$i], 10))
-					EndIf
-				EndIf
-			Next
-		EndIf
-	EndIf
-	
-	Return $vValue
+	Return $oContainer.GetProperty($sVarName)
 EndFunc
 
 #EndRegion Public Functions
Код:
Func _WinAPI_ReadProcessMemoryEx($iProcessID, $pPointer, $sStructTag)
	Local $iSYNCHRONIZE = (0x00100000), $iSTANDARD_RIGHTS_REQUIRED = (0x000F0000)
	Local $iPROCESS_ALL_ACCESS = ($iSTANDARD_RIGHTS_REQUIRED + $iSYNCHRONIZE + 0xFFF)
	Local $hProcess, $Struct, $StructPtr, $StructSize, $Read

	$hProcess = _WinAPI_OpenProcess($iPROCESS_ALL_ACCESS, False, $iProcessID)
	If @error Then Return SetError(@error, 1, $Struct)

	$Struct = DllStructCreate($sStructTag)
	$StructSize = DllStructGetSize($Struct)
	$StructPtr = DllStructGetPtr($Struct)

	_WinAPI_ReadProcessMemory($hProcess, $pPointer, $StructPtr, $StructSize, $Read)
+	_WinAPI_CloseHandle($hProcess)

	Return SetError(@error, $Read, $Struct)
EndFunc
OffTopic:
В виду того что это не чистый AutoIt код, он отображается не очень корректно
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Olim98,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх