Что нового

Подобие Dll в AutoIt

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Конечно же это ни есть Dll потому что в другом ЯП функции с неё не вызовишь, но очень похожа...

Пример:
Код:
#Include <GUIConstantsEx.au3>

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

$hForm = GUICreate("AutoIt dll", 300, 200)
$hButton = GUICtrlCreateButton("Сменить Title", 20, 20, 80, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
	    Case $GUI_EVENT_CLOSE
		    Exit
		Case $hButton
			ConsoleWrite("Result = " & AutoItDllCall($Lib, "Au3Lib_SetWinTitle", $hForm, "Сменили Title") & @CRLF)
	EndSwitch
WEnd

Func AutoItDllCall($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

Файл типо Dll:
Код:
#NoTrayIcon

If $CmdLine[0] Then
    If $CmdLine[1] = "Au3Lib_SetWinTitle" Then Au3Lib_SetWinTitle($CmdLine[2], $CmdLine[3])  
EndIf

Func Au3Lib_SetWinTitle($hWnd, $sText)
    If Not IsHWnd($hWnd) Then $hWnd = HWnd($hWnd)
    Local $Ret = DllCall("user32.dll", "bool", "SetWindowTextW", "hwnd", $hWnd, "wstr", $sText)
	If @error Then Return SetError(@error, @extended, False)
	ConsoleWrite($Ret[0])
EndFunc

Просто компилируем 'Файл типо Dll' и по желанию сменяете расширение с exe на dll

И пример в готовой сборке.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Viktor1703,
Параметры передаются строкой. Если Вы передаете Handle, то надо преобразовать его.
Код:
;...
Func Au3Lib_SetWinTitle($hWnd, $sText)
	If Not IsHWnd($hWnd) Then $hWnd = HWnd($hWnd)
	;...или без проверки
	$hWnd = HWnd($hWnd)
	;...
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Хорошо, учту, хотя и так работает, но на будущее лучше пусть будет по надёжней, спасибо.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 595
Репутация
938
Исходник уже скомпиленной дллки имеет такую же защиту как и ехешник Autoit?
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
А у AutoIt есть защита? если вы имеете ввиду что есть ли защита у 'dll' от декомпиляции то - нету, это тот же самый скомпиленый exe, а если вы имеете ввиду защита исходника как у AutoIt.exe - то я не пойму вопроса.
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
Если вдруг данное решение станет актуальным и участники данного форума начнут обмениватся такими модулями то можно написать так:

Внешний файл:
Код:
#NoTrayIcon

Global $AllFunction[1] ; Массив со списком всех функций с параметрами в dll. 
$AllFunction[0] = "Au3Lib_SetWinTitle($hWnd, $sText)"

If $CmdLine[0] Then 
	If $CmdLine[1] = "Au3Lib_AllFunction" Then Au3Lib_AllFunction($AllFunction)
    If $CmdLine[1] = "Au3Lib_SetWinTitle" Then Au3Lib_SetWinTitle($CmdLine[2], $CmdLine[3])  
EndIf

Func Au3Lib_AllFunction(ByRef $ArrayFunc)
	Local $iData
	If IsArray($ArrayFunc) Then
	    For $i = 0 To UBound($ArrayFunc) -1
		    $iData &= $ArrayFunc[$i] & @CRLF
	    Next
		ConsoleWrite($iData)
	EndIf	
EndFunc	

Func Au3Lib_SetWinTitle($hWnd, $sText)
	If Not IsHWnd($hWnd) Then $hWnd = HWnd($hWnd)
    Local $Ret = DllCall("user32.dll", "bool", "SetWindowTextW", "hwnd", $hWnd, "wstr", $sText)
	If @error Then 
		ConsoleWrite(SetError(@error, @extended, False))
	Else	
	    ConsoleWrite($Ret[0])
	EndIf	
EndFunc

Скрипт:
Код:
; код
ConsoleWrite(AutoItDllCall($Lib, "Au3Lib_AllFunction") & @CRLF)
; код

Это для того чтоб не было проблем как с настоящими dll, Вы всегда можете узнать не только список функций в модуле но и число и типы параметров.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 575
Репутация
335
Не вижу плюсов метода. Viktor1703, можешь пояснить для чего нужен такой костыль? Чем он лучше, чем простое объявление функции в теле основной программы.

Минусы:
-Время отработки скриптов увеличивается.
-Для работы финальной версии программы нужны будут лишние файлы, которые в принципе можно было написать в теле скрипта, ну или максимум #include файлом прикрепить.

Программисты наоборот стараются свести программу к меньшему количеству файлов для максимального удобства переноса. Все иконки, картинки - запихивают в exe файл. Все сложные для AutoIT функции выделяются в отдельную DLL написанную на другом ЯП.
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
410
В принципе, решайте сами, будете пользоватся или нет, я не навязываю, например мне в некоторых случаях просто необходим такой вариант, а в некоторых могу и без него обойтись. :smile:

Кстати не все знают другой ЯП чтоб писать нормальные dll'ки
 

Arei

Скриптер
Сообщения
938
Репутация
115
Спасибо, отличная реализация.
 
Верх