Что нового

Пишем свои компоненты

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
На оф.форуме нашёл пример как можно написать свой ActiveX компонент без компиляции и создания dll, но ни один пример так и не заработал, чуть - чуть погуглив, пришлось почитать о WSC скриптах, в принципе ни чего сложного нет, можно брать готовый шаблон и добавлять свои функции, вот пример самого компонента:

Код:
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>

<?component error="true" debug="true"?>

<package>

<!--
=====================================AutoIt.Msg===================================
-->

<component id="Example">

<registration progid="AutoIt.Msg" classid="{96AE6C76-AC01-4C05-9A4B-56E46CF1076C}"/>

<public>
    <property name="Version"><get/></property>
    <property name="LastErrorInfo"><get/></property>
    <property name="LastErrorMethod"><get/></property>
    <property name="LastErrorReason"><get/></property>
    <property name="LastErrorNumber"><get/></property>
    <property name="LastErrorDescription"><get/></property>
    <property name="LastErrorSource"><get/></property>
    <event name="OnError"/>
    
    <method name="MsgCom"><parameter name="MsgCom"/></method>
</public>

<resource id="ver">1.21</resource>

<script language="VBScript"><![CDATA[

' информация о последней произошедшей ошибке
LastErrorInfo = ""
LastErrorMethod = ""
LastErrorReason = ""
LastErrorNumber = ""
LastErrorDescription = ""
LastErrorSource = ""

Sub ClearLastError()
    LastErrorInfo = ""
    LastErrorMethod = ""
    LastErrorReason = ""
    LastErrorNumber = ""
    LastErrorDescription = ""
    LastErrorSource = ""
End Sub

Sub fireError(strInfo, strMethod, strReason)
    LastErrorInfo = strInfo
    LastErrorMethod = strMethod
    LastErrorReason = strReason
    LastErrorNumber = Err.Number
    LastErrorDescription = Err.Description
    LastErrorSource = Err.Source
    Err.Clear
    fireEvent("onError")
End Sub

Function get_LastErrorInfo()
    get_LastErrorInfo = LastErrorInfo
End Function
Function get_LastErrorMethod()
    get_LastErrorMethod = LastErrorMethod
End Function
Function get_LastErrorReason()
    get_LastErrorReason = LastErrorReason
End Function
Function get_LastErrorNumber()
    get_LastErrorNumber = LastErrorNumber
End Function
Function get_LastErrorDescription()
    get_LastErrorDescription = LastErrorDescription
End Function
Function get_LastErrorSource()
    get_LastErrorSource = LastErrorSource
End Function
Function get_Version()
    get_Version = GetResource("ver")
End Function

Function MsgCom(Index, Title, Text)
    MsgCom = MsgBox (Text, Index, Title)
End Function

]]></script>

</component>

<!--
=====================================AutoIt.Msg===================================
-->

</package>

В данном примере вызывается функция MsgCom и возвращает значение выполнения функции, в случае ошибки вызова компонента предусмотрены функции выше, они вернут код ошибки в AutoIt скрипт, для того чтоб зарегистрировать компонент, достаточно нажать ПКМ на файл и выбрать "Подключить", после этого можно писать AutoIt код:

Код:
$oAutoIt = ObjCreate('AutoIt.Msg')
$Ret = $oAutoIt.MsgCom (64, 'AutoIt.Msg', 'Example')
MsgBox(0, 'Return', 'Return code = ' & $Ret)


P.S. Тестировалось на XP, отрабатывает отлично, прозьба протестировать на других системах.
 

XpycT

Скриптер
Сообщения
380
Репутация
133
Viktor1703
У меня выпадает с ошибкой

Все разобрался
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Значит на XP гарантировано работает, хотелось бы чтоб и на 7/Vista так же работало :smile:
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
---------------------------
AutoIt Error
---------------------------
Line 2  (File "C:\Users\111111\Desktop\AutoIt.Msg.exe"):


Error: Variable must be of type "Object".
windows 7
мож я что не так понял?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
У меня работает даже и не через Autoit, а при вызове из другой программы.

Viktor1703
Где можно почитать про добавление своих функций в такой компонент?
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Александр, а Вы компонент зарегистрировали в системе?

чтоб зарегистрировать компонент, достаточно нажать ПКМ на файл и выбрать "Подключить", после этого можно писать AutoIt код

скачайте архив прикреплённый к первому посту, разархивируйте файлы в какую нибудь папку, далее нажмите правой кнопкой мыши на файл AutoIt.Msg.wsc, выберите 'Подключить', а потом запускайте AutoIt скрипт, если XP, то должно работать без ошибок, на счёт 7/Vista - не знаю, но WSWR говорит что вроде работает :smile:


Добавлено:
Сообщение автоматически объединено:

Где можно почитать про добавление своих функций в такой компонент?

Да в принципе везде :smile: в нэте море инфы, эти функции VBS скрипта, нужно просто изучить VBS и можно писать функции в компонент. Могу предложить форум где обсуждают VBS/JS/HTA/WSH

Посмотрите пример компонента, чтоб добавить функцию нужно сначала объявить метод между тегами <public></public>:

Пример из компонента:
Код:
<method name="MsgCom"><parameter name="MsgCom"/></method>

Ниже неё или вместо неё ставим свой метод:

Код:
<method name="Название функции"><parameter name="Название функции"/></method>

И соответственно изменить или добавить функцию

Код:
Function Название функции()
    ; Код 
End Function
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ага. сработало..просто поосторожничал ..подключать :smile:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Александр, я тоже сначала не хотел, а потом всё таки подключил на свой страх и риск, но к моему большому удивлению после запуска AutoIt скрипта, всё сработало :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
можно брать готовый шаблон и добавлять свои функции
Функции на VBS? А смысл?

Вот если бы их можно было писать на AutoIt.
Но для этого уже есть AutoItX3.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
Расскажите, что это дает? Как работает?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
CreatoR
Но для этого уже есть AutoItX3.

На первый взгляд, у AutoItX3 бедноват функционал, например, как с его помощью хотя бы вывести сообщение MsgBox?

У меня есть приложение, которое поддерживает вызов функций только по COM, и эти компоненты мне будут очень полезны.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Это для общего развития, например мне было очень интересно, если бы можно было такое на AutoIt.... :'(

DarWiM, ну что тут рассказать, это обычный компонент (Windows Script Component) позволяет создавать функции и регистрировать их в системе, а вызывать с помощью создания этого объекта в коде, то есть вызов будет происходить не как DllCall(), но возможности VBS не такие расширенные как у AutoIt, ещё раз повторю, это для общего развития, я не предлогаю использовать это как часть AutoIt кода, а всего лишь привожу пример как можно сделать, я например не знал о таком способе, и очень удивился когда узнал, ну и естественно попробывал :smile:, но я так думаю что здесь можно писать не только VBS функции но и других скриптовых языков которые не нуждаются в компиляции и создании исполняющего файла.


Добавлено:
Сообщение автоматически объединено:

WSWR, могу дать Obfuscator для VBS кода.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Viktor1703
могу дать Obfuscator для VBS кода.
Спасибо, у меня коды только для себя, скрывать ни от кого не нужно.

CreatoR
Значит нужно сделать второй

Так как с помощью AutoItX3 вывести простое сообщение?
В справке по AutoItX в COM Interface не вижу такого метода.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
OffTopic:
Подскажите пожалуйста, в Perl имеется возможность вызова API функций нативными функциями?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
WSWR [?]
как с помощью AutoItX3 вывести простое сообщение?
Видимо никак. MsgBox есть и в vbs, наверное поэтому посчитали ненужным его добавление.
 
Верх