Что нового

"Ошибка" в директиве #OnAutoItStartRegister

tech-gs

Знающий
Сообщения
54
Репутация
5
Замечено два недочета в работе директивы #OnAutoItStartRegister "..." на версии 3.3.6.1:

1) директива работает только в виде #OnAutoItStartRegister "function", объявление #OnAutoItStartRegister 'function' уже не проходит (мелочь, но пришлось поковыряться некоторое время пока разобрался). Все остальные функции/директивы корректно работают со строками, представленными как "...", так и '...'.

2) #OnAutoItStartRegister некорректно обрабатывает директивы #include <...>. Как пример, привожу несколько переделанный код из справки AutoIt:
Код:
#include <GUIConstantsEx.au3>
#OnAutoItStartRegister "MyTestFunc"

Sleep(1000)

Func MyTestFunc()
	MsgBox(64, "Start Results 2", 'Start Message from MyTestFunc()' & @LF & '$GUI_EVENT_CLOSE = ' & $GUI_EVENT_CLOSE)
EndFunc

При запуске кода в окне 'Output' следующее:
>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\Projects\OnAutoItStartRegister.au3"
D:\Projects\OnAutoItStartRegister.au3 (7) : ==> Variable used without being declared.:
MsgBox(64, "Start Results 2", 'Start Message from MyTestFunc()' & @LF & '$GUI_EVENT_CLOSE = ' & $GUI_EVENT_CLOSE)
MsgBox(64, "Start Results 2", 'Start Message from MyTestFunc()' & @LF & '$GUI_EVENT_CLOSE = ' & ^ ERROR
>Exit code: 1 Time: 0.288

Перестановка местами #include и #OnAutoItStartRegister проблему не решает.
Операционная система Windows 7 x64.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Re: #OnAutoItStartRegister

2. IMHO
AutoIt Help сказал(а):
Registers a function to be called when AutoIt starts.
Вероятно, что этот оператор читается даже раньше, чем #include. Отсюда и ошибка. Выполните код, приведённый ниже, предварительно закомментировав строку #include-once в UDF GUIConstantsEx.au3
Код:
#include <GUIConstantsEx.au3>
#OnAutoItStartRegister "MyTestFunc"

MsgBox(64, "Start Results 1", 'Start Message from MyTestFunc()' & @LF & '$GUI_EVENT_CLOSE = ' & $GUI_EVENT_CLOSE)

Func MyTestFunc()
	#include <GUIConstantsEx.au3>
    MsgBox(64, "Start Results 2", 'Start Message from MyTestFunc()' & @LF & '$GUI_EVENT_CLOSE = ' & $GUI_EVENT_CLOSE)
EndFunc
В итоге получим Can not redeclare a constant когда начнёт выполняться
Код:
MsgBox(64, "Start Results 1", 'Start Message from MyTestFunc()' & @LF & '$GUI_EVENT_CLOSE = ' & $GUI_EVENT_CLOSE)


1. Я не уверен, но может невосприятие одинарных кавычек это следствие того, что #OnAutoItStartRegister читается на стадии старта Autoit`a.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Re: #OnAutoItStartRegister

tech-gs [?]
1) директива работает только в виде #OnAutoItStartRegister "function", объявление #OnAutoItStartRegister 'function' уже не проходит (мелочь, но пришлось поковыряться некоторое время пока разобрался). Все остальные функции/директивы корректно работают со строками, представленными как "...", так и '...'.
Тут явно ошибка. Даже если и учитывать, что синтаксис директивы требует указания имени функции в двойных кавычках, то непонятно, почему одинарные кавычки просто игнорируются. Более того, допустимым вариантом является запись вида: #OnAutoItStartRegister 'MyTestFunc", что в явном виде противоречит синтаксису языка.

2) #OnAutoItStartRegister некорректно обрабатывает директивы #include <...>
А разве должна? Функция вызывается при старте скрипта. То есть до того, как будет выполнен какой-либо код за пределами этих функций. Это означает, что все переменные, которые объявляются в этих файлах, объявляются уже после выполнения функции. Таким образом, все переменные, используемые в функциях #OnAutoItStartRegister должны объявлятся в этих самых функциях.
 
Автор
T

tech-gs

Знающий
Сообщения
54
Репутация
5
Re: #OnAutoItStartRegister

1) Раз налицо ошибка с ' и ", нужно теперь писать разработчикам AutoIt, или проблема каким-то другим путем дойдет до них?

2) Получается, что и в самом деле #OnAutoItStartRegister стартует перед всем остальным директивами, потому как следующий код проходит нормально:
Код:
#OnAutoItStartRegister "MyTestFunc"

Func MyTestFunc()
#include <GUIConstantsEx.au3>
	MsgBox(64, "Start Results 2", 'Start Message from MyTestFunc()' & @LF & '$GUI_EVENT_CLOSE = ' & $GUI_EVENT_CLOSE)
EndFunc

Тогда вообще не понимаю зачем такая директива нужна, разве что для тестирования простеньких функций. Я же хотел ее использовать для реализации модульности программы - основное тело программы и несколько скриптов разной функциональности, а функцию #OnAutoItStartRegister для отладки этих модулей по отдельности. А в них куча своих функций и директив #include...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Re: #OnAutoItStartRegister

tech-gs сказал(а):
Тогда вообще не понимаю зачем такая директива нужна, разве что для тестирования простеньких функций.

Вот простой пример, где мне это понадобилось. В большинстве случаев эта директива может понадобиться при написании UDF библиотек.

tech-gs сказал(а):
...нужно теперь писать разработчикам AutoIt, или проблема каким-то другим путем дойдет до них?

:smile:

Само не дойдет. Я тут еще кое-что проверю и составлю запрос...
 
Верх