Автор Тема: Объектно-ориентированное программирование в AutoIt  (Прочитано 19371 раз)

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

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Версия AutoIt должна быть 3.3.8.1 и выше  :)

Код: AutoIt [Выделить]
Global $tagInterface = 'MessageBox int(uint;wstr;wstr);' & _
                       'ToolTip void(wstr;int;int);'

Global $a__Methods[2] = [DllCallbackRegister('Test__MsgBox','int','ptr;uint;wstr;wstr'), _
                         DllCallbackRegister('Test__ToolTip','none','ptr;wstr;int;int')]


Func Test()
    Local $a__Result[2], $i__Number = UBound($a__Methods)
    If ($i__Number > 0) Then
        $a__Result[1] = DllStructCreate('ptr VTable;ulong_ptr Number;ptr Method[' & $i__Number & ']')
        DllStructSetData($a__Result[1], 'VTable', DllStructGetPtr($a__Result[1], 'Method'))
        DllStructSetData($a__Result[1], 'Number', $i__Number)
        For $i = 1 To $i__Number
            DllStructSetData($a__Result[1], 'Method', DllCallbackGetPtr($a__Methods[$i - 1]), $i)
        Next
        $a__Result[0] = ObjCreateInterface(DllStructGetPtr($a__Result[1]), '', $tagInterface, False)
        If IsObj($a__Result[0]) Then
            Return $a__Result
        EndIf
    EndIf
    Return 0
EndFunc

Func Test__MsgBox($p_This, $i_Flag, $s_Title, $s_Text)
    Return MsgBox($i_Flag, $s_Title, $s_Text)
EndFunc

Func Test__ToolTip($p_This, $s_Text, $i_Left, $i_Top)
    ToolTip($s_Text, $i_Left, $i_Top)
EndFunc

Func Destroy($o__Object)
    If (IsArray($o__Object) And (Ubound($o__Object) >= 2)) Then
        $o__Object[0] = 0
        $o__Object[1] = 0
        For $i = 0 To UBound($a__Methods) - 1
            DllCallbackFree($a__Methods[$i])
        Next
    EndIf
EndFunc

$oTest = Test()
$oTest[0].MessageBox(32, 'Title', 'Text')
$oTest[0].ToolTip('AutoIt v3 - это язык для написания сценариев, напоминающий BASIC и предназначенный для автоматизации Windows GUI', 20, 20)
Sleep(5000)
$oTest[0].ToolTip('', 0, 0)
Destroy($oTest)
 


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

Объектно-ориентированное программирование в AutoIt
« Отправлен: Февраль 26, 2013, 14:06:17 »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
интересный пример,  :think: осталось придумать где он может пригодится

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Ещё один пример...

Пример:
Код: AutoIt [Выделить]
#include <GUIOOP.au3>

Global $oGui = GUIConstructor()

If IsObj($oGui) Then
    $hForm = $oGui.GUICreate('OOP AutoIt Gui', 500, 400, -1, -1, $oGui.GUI_SS_DEFAULT_GUI, 0, 0)
    $oGui.GUIBind($oGui.GUI_EVENT_CLOSE, 'OnExit')
    $oGui.GUISetState(@SW_SHOW, $hForm)
    While 1
        $oGui.GUIMainLoop($hForm)
    Wend
EndIf

Func OnExit($hWnd)
    If (MsgBox(4, $hWnd, 'Вы действительно желаете закрыть окно?') == 6) Then
        Exit
    EndIf
EndFunc
 


GUIOOP.au3
(нажмите для показа/скрытия)
« Последнее редактирование: Август 17, 2013, 23:14:57 от Viktor1703 »

Оффлайн sims [?]

  • Осваивающий
  • **
  • Сообщений: 184
  • Репутация: 24
  • Пол: Мужской
    • Награды
Обычно содержимое класса не видно вне его пределов (инкапсуляция), но здесь этого не наблюдается и к содержимому класса можно обратиться в обход его экземпляра.
Если бы была поддержка пространства имен (namespace), то это можно было бы исправить.

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

Re: Объектно-ориентированное программирование в AutoIt
« Ответ #3 Отправлен: Август 18, 2013, 00:41:43 »

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
sims

Ну это же AutoIt, какие тут Namespace  :)

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Viktor1703
Для OOP есть хорошая библиотека AutoItObject.au3

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




Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Garrett

Да, я знаю  :)

Оффлайн sims [?]

  • Осваивающий
  • **
  • Сообщений: 184
  • Репутация: 24
  • Пол: Мужской
    • Награды
Viktor1703  [?]
Цитировать
Ну это же AutoIt, какие тут Namespace
Почему же так пессимистично?
Нужно попросить разработчиков чтобы они добавили поддержку пространства имен.
Это значительно упростит разработку и поддержку UDF, ведь не нужно будет думать о том, что могут совпасть имена, переменных, констант, функций и т. д. Даже если имена совпадут, но расположены в разных Namespace, это не приведет конфликту имен.

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

Re: Объектно-ориентированное программирование в AutoIt
« Ответ #7 Отправлен: Август 18, 2013, 11:20:03 »

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
sims  [?]
Цитировать
Почему же так пессимистично?Нужно попросить разработчиков чтобы они добавили поддержку пространства имен.Это значительно упростит разработку и поддержку UDF, ведь не нужно будет думать о том, что могут совпасть имена, переменных, констант, функций и т. д. Даже если имена совпадут, но расположены в разных Namespace, это не приведет конфликту имен.

Я думаю они откажутся это делать.

P.S. Кстати, кто знает, какую API функцию использует ObjCreateInterface ?



Добавлено: Август 18, 2013, 13:10:38
И ещё один пример

AutoIt

(нажмите для показа/скрытия)

PureBasic Dll

(нажмите для показа/скрытия)
« Последнее редактирование: Август 18, 2013, 13:14:33 от Viktor1703, Причина: Объединение сообщений »

Оффлайн sims [?]

  • Осваивающий
  • **
  • Сообщений: 184
  • Репутация: 24
  • Пол: Мужской
    • Награды
Viktor1703  [?]
Цитировать
Я думаю они откажутся это делать.
Да, это прибавит им работы, но оно того стоит, ведь упростит разработку. Стоит попросить. Возможно что сделают.


Цитировать
какую API функцию использует ObjCreateInterface
Не думаю что там используется какая-то специфичная WinAPI фукнция. Скорее всего просто создается интерфейс (таблица с указателями на функции и описанием их аргументов).


Цитировать
И ещё один пример
Не помешало бы добавить деструктор объекта чтобы его можно было бы уничтожить.
(нажмите для показа/скрытия)

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
sims  [?]
Цитировать
Не помешало бы добавить деструктор объекта чтобы его можно было бы уничтожить.

Ну это пример и врятли кто-то в ближайшее время будет пользоваться этим

Цитировать
Да, это прибавит им работы, но оно того стоит, ведь упростит разработку. Стоит попросить. Возможно что сделают.

Было бы не плохо, тогда можно будет портировать Qt под AutoIt (естественно если будет полноценный ООП)

Цитировать
Не думаю что там используется какая-то специфичная WinAPI фукнция. Скорее всего просто создается интерфейс (таблица с указателями на функции и описанием их аргументов).

хм, возможно, однако объект созданный через ObjCreate и ObjCreateInterface не возвращает ни чего, точнее в консоли пустое значение, хотел добавить сам ObjCreateInterface в dll чтобы при вызове она возвращала уже готовый объект а не указатель на таблицу.

   

Оффлайн sims [?]

  • Осваивающий
  • **
  • Сообщений: 184
  • Репутация: 24
  • Пол: Мужской
    • Награды
Viktor1703  [?]
Цитировать
тогда можно будет портировать Qt под AutoIt
В каком смысле?


Цитировать
объект созданный через ObjCreate и ObjCreateInterface не возвращает ни чего
Он может возвращать, скажем, номер объекта, а не сам объект или указатель на него.

Цитировать
хотел добавить сам ObjCreateInterface в dll
Для этого нужно писать dll на AutoIt или сделать аналог ObjCreateInterface, если знаете принцип создания объекта. Но думаю что это не так просто осуствить, ведь наверняка объект регистрируется где-то в интерпретаторе и даже если его вернуть из dll, то это не сработает.

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
sims  [?]
Цитировать
или сделать аналог ObjCreateInterface, если знаете принцип создания объекта

Так вот же и спрашиваю


Цитировать
В каком смысле?

В самом прямом

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 961
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Garrett

Это конечно всё хорошо, но мало чем помогает, дело в том что там примеры на C++ а он сам по себе ООП, в примерах заметил

pCF = new MathClassFactory;
где pCF содержит уже готовый объект, то есть мне нужны сами низа, как получить экземпляр объекта имея указатель на таблицу функций с помощью WinAPI (подозреваю Co и Ole функции), если возвращать указатель на таблицу, то приходится использовать ObjCreateInterface, если возвращать указатель на интерфейс, то естественно не работает.... для получения объекта с помощью DllCall в тип возвращаемого значения вроде нужно писать idispatch

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

Re: Объектно-ориентированное программирование в AutoIt
« Ответ #14 Отправлен: Август 18, 2013, 16:37:35 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
14 Ответов
61510 Просмотров
Последний ответ Апрель 28, 2012, 12:36:49
от CreatoR
2 Ответов
10142 Просмотров
Последний ответ Ноябрь 16, 2009, 09:13:26
от Suppir
12 Ответов
24944 Просмотров
Последний ответ Август 27, 2011, 20:09:15
от Nero21
15 Ответов
11491 Просмотров
Последний ответ Май 01, 2012, 22:32:34
от running-frag
6 Ответов
4102 Просмотров
Последний ответ Ноябрь 08, 2010, 13:06:56
от Belfigor
18 Ответов
6973 Просмотров
Последний ответ Октябрь 30, 2011, 17:09:36
от VladUs
30 Ответов
17615 Просмотров
Последний ответ Апрель 02, 2012, 03:44:53
от Garrett
4 Ответов
6011 Просмотров
Последний ответ Июль 12, 2012, 11:06:51
от firex
4 Ответов
1563 Просмотров
Последний ответ Февраль 25, 2015, 22:20:10
от joiner
2 Ответов
1506 Просмотров
Последний ответ Март 21, 2016, 23:02:27
от AZJIO