Что нового

PluginInclude - Подключение внешних динамических библиотек

CreatoR

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

Категория: Вспомогательные функции, Разное

Описание: Данная библиотека предназначена для подключения динамических библиотек, для последующего вызова содержащихся в них функций.
Полезно при необходимости подключать внешние модули, наподобие плагинов, которые пользователь может редактировать даже если главный скрипт скомпилирован.

Содержимое динамической библиотеки:
Код:
#NoTrayIcon

Global $sPI_Name = @ScriptName

If WinExists($sPI_Name) Then
	Exit
EndIf

AutoItWinSetTitle($sPI_Name)

#Region Container UDF: http://www.autoitscript.com/forum/topic/126936-container-udf-scripts-interaction-library

Global $oContainerOMErr

Func _Container_Open($sName, $iMode)
	Local $oShell, $oShellWindow, $oShellWindows
	
	If Not ObjEvent("AutoIt.Error") Then
		$oContainerOMErr = ObjEvent("AutoIt.Error", "__Container_COMErrHandler")
	EndIf
	
	$oShell = ObjCreate("Shell.Application")
	
	If Not IsObj($oShell) Then
		Return SetError(2, 0, 0)
	EndIf
	
	$oShellWindows = $oShell.Windows
	
	For $oShellWindow In $oShellWindows
		If $oShellWindow.StatusText = $sName Then
			Return $oShellWindow
		EndIf
		
		If @error Then
			ExitLoop
		EndIf
	Next
	
	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
		Return SetError(3, 0, 0)
	EndIf
	
	$oContainer.StatusBar = True ; IMPORTANT!!
	$oContainer.StatusText = $sName
	
	Return $oContainer
EndFunc

Func _Container_Close($oContainer)
	Local $iRet = 0
	Local $hContainer = HWnd($oContainer.HWnd)
	
	If $hContainer Then
		$iRet = WinClose($hContainer)
	EndIf
	
	Return SetError(Number($iRet <> 1), 0, $iRet)
EndFunc

Func _Container_PutProperty($oContainer, $sVarName, $vValue)
	If Not IsObj($oContainer) Then
		Return SetError(1, 0, 0)
	EndIf
	
	$oContainer.PutProperty($sVarName, $vValue)
EndFunc

Func _Container_GetProperty($oContainer, $sVarName)
	If Not IsObj($oContainer) Then
		Return SetError(1, 0, 0)
	EndIf
	
	Return $oContainer.GetProperty($sVarName)
EndFunc

Func __Container_COMErrHandler()
	SetError(1)
Endfunc

Global $oContainer = _Container_Open("PI_Storage", 0)

#EndRegion Container UDF

$sFunc_Name = _Container_GetProperty($oContainer, "PI_Func_Name")
$sFunc_Params = _Container_GetProperty($oContainer, "PI_Func_Params")

$vReturn = Call($sFunc_Name, $sFunc_Params)
_Container_PutProperty($oContainer, "PI_Func_Return", $vReturn)

While _Container_GetProperty($oContainer, "PI_Func_Return") <> ''
	Sleep(10)
WEnd

;==== UDFs Part ====

Func Some_UDF($sParams)
	Local $iRet = MsgBox(36, @ScriptName & " - Question", $sParams)
	Return $iRet
EndFunc


- Всё что до ;==== UDFs Part ====, это обработка передаваемых в библиотеку параметров.
- Всё что после этого разделителя, это функций доступные на выполнение главному скрипту (который подключает библиотеку/плагин).

Пример (требуются подключаемые библиотеки, см. выше):
Код:
#include <PluginInclude.au3>

_PluginInclude_AddInclude(@ScriptDir & "\External_UDFs.fnc")
_PluginInclude_AddInclude(@ScriptDir & "\Other_UDFs.fnc")

$vRet = _PluginInclude_ExecuteFunc("Some_UDF", "Are you sure?")

If Not @error Then
	MsgBox(64, @ScriptName & " - ExecuteFunc", "Returned Message from Some_UDF: " & $vRet)
EndIf

$vRet = _PluginInclude_ExecuteFunc("Other_UDF", "Notepad.exe") ;Run the notepad

If Not @error Then
	MsgBox(64, @ScriptName & " - ExecuteFunc", "Returned Message from Other_UDF.fnc (Other_UDF): " & $vRet)
EndIf

;=== Passing arrays ===
Dim $aArr[2]
$aRet = _PluginInclude_ExecuteFunc("SetArray", $aArr)

If Not @error Then
	MsgBox(64, @ScriptName & " - ExecuteFunc", "Returned Message from Other_UDF.fnc (SetArray): " & $aRet[1])
EndIf

Файл: PluginInclude.zip

История версий:
[1.1]
* Теперь библиотека использует Container.au3 для интеракции с подключаемыми плагинами.
Это решает проблему с передачей массивов (пока только 2D) и других типов данных в параметрах вызова.

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

Источник: www.autoit-script.ru
Автор(ы): G.Sandler (CreatoR)
 

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
а здесь что,можно только функции прописывать где требуется один параметр?
как мне сделать в динамической UDF например такую функцию
Код:
Func _pic($pic,$left,$top,$width,$height)
     GUICtrlCreatePic($pic,$left,$top,$width,$height)
EndFunc
 
Автор
CreatoR

CreatoR

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

как мне сделать в динамической UDF например такую функцию
Код:
Func _pic($aParams)
    Local $sPic = $aParams[0], $iLeft = $aParams[1], $iTop = $aParams[2], $iWidth = $aParams[3], $iHeight = $aParams[4]
    GUICtrlCreatePic($sPic, $iLeft, $iTop, $iWidth, $iHeight)
EndFunc


и соответсвенно передавать массивом из главного скрипта:
Код:
Dim $aParams[5] = [$sPic, $iLeft, $iTop, $iWidth, $iHeight]
_PluginInclude_ExecuteFunc("_pic", $aParams)
 

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Всё ясно,спасибо,ещё хотел спросить но забыл,а в начале динамической библиотеки обязательно должно быть это:
Код:
#NoTrayIcon

If $CmdLine[0] = 0 Then Exit ;We need at least 1 command line

;Collecting parameters
$sParams = ""

For $i = 2 To $CmdLine[0]
    $sParams &= $CmdLine[$i] & "|"
Next

$sParams = StringTrimRight($sParams, 1)
Call($CmdLine[1], $sParams)
If @error Then Call($CmdLine[1])


Просто у меня и без этого работало
 
Автор
CreatoR

CreatoR

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

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Всё спасибо,вопросов больше нет,нужнаю штука :smile:
 

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Зделал как Вы написали,но ничего не получилось,выдаёт ошибку
 
Автор
CreatoR

CreatoR

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

Версию где массивы поддерживаются я уже доработал, выложу чуть позже.
 
Автор
CreatoR

CreatoR

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

[1.1]
* Теперь библиотека использует Container.au3 для интеракций с подключаемыми плагинами.
Это решает проблему с передачей массивов (пока только 2D) и других типов данных в параметрах вызова.

См. первое сообщение темы.
 
Верх