Что нового

Вызов функции из внешнего файла

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Скрипт вызывает функцию из внешнего файла и возвращает результат обратно, спасибо madmasles,у за помощь.

Функция:
Код:
; 1й параметр определяет какую функцию мы хотим вызвать, наприер если "Math; 5; 5"  то вызываем функцию Math().

Global $Lib = @ScriptDir & "\Au3Lib.lib"

$MsgA = AutoItLibCall($Lib, "MsgA, 32, AutoItLibCall, Пример вызова функции из внешнего файла", ",")
ConsoleWrite("MsgA Result = " & $MsgA & @CRLF)

$Math = AutoItLibCall($Lib, "Math;5;5")
ConsoleWrite("Math Result = " & $Math & @CRLF)

$Line = AutoItLibCall($Lib, "Line;10")
ConsoleWrite("Line Result = " & $Line & @CRLF)

; Пример вызова функции с применением переменных значений.
Global $iFunc  = "MsgA"
Global $iType  = 48
Global $iTitle = "AutoItLib"
Global $iText  = "AutoIt Script"
AutoItLibCall($Lib, $iFunc & "," & $iType & "," & $iTitle & "," & $iText, ",")

$iType  = 16
$iTitle = "AutoItLib"
$iText  = "Error open library"
AutoItLibCall($Lib, $iFunc & "@" & $iType & "@" & $iTitle & "@" & $iText, "@")

#cs
    Функция AutoItLibCall($iLib, $iParams, $iDivider = ";")
	
    $iLib      Файл библиотеки.
    $iParams   Параметры функции которую вызываем.
    $iDivider  Разделитель между параметрами.
#ce

Func AutoItLibCall($iLib, $iParams, $iDivider = ";")

	Local $Array[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], $iParam, $iPid, $iRead
	Local $iCol = StringSplit($iParams, $iDivider)
		  
    If $iCol[0] > UBound($Array) Then
	    $Array[0] += 10
	    ReDim $Array[$Array[0] + 10]
	EndIf
	
	For $i = 1 To $iCol[0]
		$Array[$i - 1] = $iCol[$i]
	Next

	If IsArray($Array) Then
	    For $i = 0 To UBound($Array) - 1
            $iParam &= ' "' & $Array[$i] & '"'
        Next
		$iPid = Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $iLib & '"' & $iParam, "", @SW_HIDE, 2)
		While 1
			$iRead &= StdoutRead($iPid)
			If $iRead Then ExitLoop
			Sleep(10)
		WEnd
		If ProcessExists($iPid) Then ProcessClose($iPid)
		Return $iRead
	EndIf
	
EndFunc

Внешний файл:
Код:
#NoTrayIcon ; Скрываем иконку в трее

;==[Au3Lib]==============================================================
;   Примечание: можно добавлять сюда инклуды, но тогда они не будут
;    компилироваться в главном скрипте и их придётся носить с собой,
; все используемые переменные должны быть прописанны здесь и объявленны
;     как пологается, пример 'Global Const $GUI_EVENT_CLOSE = -3'
;========================================================================

; Типо регистрация всех имеющихся функций.

If $CmdLine[0] Then                                                                            ; Проверяем, есть ли данные в командной строке.
    If StringStripWS($CmdLine[1], 8) = "MsgA" Then MsgA($CmdLine[2], $CmdLine[3], $CmdLine[4]) ; Если 1й параметр cmd равен MsgA, то вызываем функцию MsgA где параметры идут поочерёдно как прописанно в главном скрипте.
    If StringStripWS($CmdLine[1], 8) = "Math" Then Math($CmdLine[2], $CmdLine[3])              ; Если 1й параметр cmd равен Math, то вызываем функцию Math. 
    If StringStripWS($CmdLine[1], 8) = "Line" Then Line($CmdLine[2])              
EndIf

; Функции
; Чтобы вернуть результат из функции в скрипт, нужно вместо Return применять ConsoleWrite()

Func MsgA($Index, $Title, $Text) 
    MsgBox($Index, $Title, $Text)
    ConsoleWrite(1)                
EndFunc

Func Math($Numb1, $Numb2)
    Local $Summ = (($Numb1 + $Numb2) * 2)
    ConsoleWrite($Summ)
EndFunc

Func Line($MaxNumb)
    Local $Line
    For $i = 0 To $MaxNumb
        $Line &= $i & "::" 
    Next
    ConsoleWrite(StringTrimRight($Line, 2))
EndFunc

Или вот такой вариант:

Функция:
Код:
; 1й параметр определяет какую функцию мы хотим вызвать, наприер если "Math"  то вызываем функцию Math().

Global $Lib = @ScriptDir & "\Au3Lib.lib"

$Result1 = AutoItLibCall($Lib, "MsgA", 48, "AutoIt Lib", "Пример вызова функции из внешнего файла")
ConsoleWrite("MsgA Result = " & $Result1 & @CRLF)

$Result2 = AutoItLibCall($Lib, "Math", 5, 5)
ConsoleWrite("Math Result = " & $Result2 & @CRLF)

$Result3 = AutoItLibCall($Lib, "Line", 10)
ConsoleWrite("Line Result = " & $Result3 & @CRLF)

If AutoItLibCall($Lib, "CreateGUI", "Example", 300, 200) = -3 Then Exit

Func AutoItLibCall($iLib, $iParam1 = 0, $iParam2 = 0, $iParam3 = 0, $iParam4 = 0, $iParam5 = 0, $iParam6 = 0, $iParam7 = 0, $iParam8 = 0, $iParam9 = 0, $iParam10 = 0)

	Local $Array[10], $iParam, $iPid, $iRead

	For $i = 1 To UBound($Array)
		$Array[$i - 1] = Eval("iParam" & $i)
	Next	
	
	If IsArray($Array) Then
		
	    For $i = 0 To UBound($Array) - 1
            $iParam &= ' "' & $Array[$i] & '"'
        Next
		
		$iPid = Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & $iLib & '"' & $iParam, "", @SW_HIDE, 2)
		
		While 1
			$iRead &= StdoutRead($iPid)
			If $iRead Then ExitLoop
			Sleep(10)
		WEnd
		
		If ProcessExists($iPid) Then ProcessClose($iPid)
			
		Return $iRead
	EndIf
	
EndFunc

Внешний файл:
Код:
#NoTrayIcon ; Скрываем иконку в трее

;==[Au3Lib]==============================================================
;   Примечание: можно добавлять сюда инклуды, но тогда они не будут
;    компилироваться в главном скрипте и их придётся носить с собой,
; все используемые переменные должны быть прописанны здесь и объявленны
;     как пологается, пример 'Global Const $GUI_EVENT_CLOSE = -3'
;========================================================================

; Типо регистрация всех имеющихся функций.

If $CmdLine[0] Then                                                          ; Проверяем, есть ли данные в командной строке.
    If $CmdLine[1] = "MsgA" Then MsgA($CmdLine[2], $CmdLine[3], $CmdLine[4]) ; Если 1й параметр cmd равен MsgA, то вызываем функцию MsgA где параметры идут поочерёдно как прописанно в главном скрипте.
    If $CmdLine[1] = "Math" Then Math($CmdLine[2], $CmdLine[3])              ; Если 1й параметр cmd равен Math, то вызываем функцию Math. 
    If $CmdLine[1] = "Line" Then Line($CmdLine[2])   
    If $CmdLine[1] = "CreateGUI" Then CreateGUI($CmdLine[2], $CmdLine[3], $CmdLine[4])  
EndIf

; Функции
; Чтобы вернуть результат из функции в скрипт, нужно вместо Return применять ConsoleWrite()

Func MsgA($Index, $Title, $Text) 
    MsgBox($Index, $Title, $Text)
    ConsoleWrite(1)                
EndFunc

Func Math($Numb1, $Numb2)
    Local $Summ = (($Numb1 + $Numb2) * 2)
    ConsoleWrite($Summ)
EndFunc

Func Line($MaxNumb)
    Local $Line
    For $i = 0 To $MaxNumb
        $Line &= $i & "::" 
    Next
    ConsoleWrite(StringTrimRight($Line, 2))
EndFunc

Func CreateGUI($Title, $Width, $Height)
    $hForm = GUICreate($Title, $Width, $Height)
    GUISetState()

    While 1
        Switch GUIGetMsg()
            Case -3
                ConsoleWrite(-3)
        EndSwitch
    Wend
EndFunc
 
Верх