1

Тема: AHK: ActiveX из AutoHotkey

Возможно ли зарегистрировать в системе как ActiveX компонент, экзешник AutoHotkey или может есть какая dll, со своим постоянным CLSID или Prog ID.
Далее при создании экземпляра в стороннем приложении, запускается скрипт AutoHotkey лучше не компилированный, в котором содержатся методы СОМ объекта, ну или как то так.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: ActiveX из AutoHotkey

https://autohotkey.com/board/topic/6178 … spatchobj/
Вот вроде что то на эту тему, но не могу найти файлы.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: ActiveX из AutoHotkey

AutoHotkey_H же позволяет использовать AutoHotkey.dll как COM-объект. А через неё вызывать функции скрипта. Сам я не пробовал, но по справке вроде так.

4

Re: AHK: ActiveX из AutoHotkey

А её можно использовать в AutoHotkey_L?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: ActiveX из AutoHotkey

Как любой другой COM-объект. COM для того и придумали, чтобы не зависеть от языка.

6

Re: AHK: ActiveX из AutoHotkey

Спасибо, надо будет попробовать. А есть идеи как некий скомпилированный скрипт зарегать как COM-объект? Вроде ехе (не только dll) файлы тоже могут выступать в этой роли.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: ActiveX из AutoHotkey

Экзешные я не пробовал делать, не знаю, как это там реализуется. Может быть, и можно средствами АНК как-то это осуществить. Но если такой экзешник должен экспортировать какие-то функции, через которые должны создаваться экземпляры объекта и т.п., то АНК тут не прокатит. Только если компилятор их добавлял бы и предоставлял какую-то связь с ними для скриптового кода. Но если просто нужно куда-то передать указатели на такие функции уже при запуске экзешника, тогда могло бы сработать, наверно.

8

Re: AHK: ActiveX из AutoHotkey

Не соображу как увязать вместе, создал например в jscript объект AutoHotkey.Script, и у меня есть скрипт AutoHotkey_L, как мне из jscript запустить функции из скрипта AutoHotkey?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: ActiveX из AutoHotkey

Это вы с помощью AutoHotkey.dll делаете? Вы её зарегистрировали?

10 (изменено: serzh82saratov, 2020-10-04 20:33:00)

Re: AHK: ActiveX из AutoHotkey

Да, всё работает, запускал код с помощью ahktextdll.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11 (изменено: serzh82saratov, 2020-10-04 20:38:16)

Re: AHK: ActiveX из AutoHotkey

serzh82saratov пишет:

как мне из jscript запустить функции из скрипта AutoHotkey?

И похожий вопрос, если в анк скрипте запустил код в ahktextdll, как мне из скрипта вызвать его функцию, и наоборот?

Из скрипта нашёл - ahkFunction, а из dll в скрипте нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: ActiveX из AutoHotkey

Обменом сообщениями, например. Либо созданием общего объекта.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: ActiveX из AutoHotkey

Это понятно.
А если передать адрес от RegisterCallback, по нему можно вызвать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: ActiveX из AutoHotkey

Нет, там отдельное адресное пространство.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: ActiveX из AutoHotkey

Но на практике всё работает.


AhkCom := ComObjCreate("AutoHotkey.Script") 
result :=  RegisterCallback("f", "Fast")
script = 
(
	DllCall(%result%, "UInt", 11, "UInt", 22) 
) 
AhkCom.ahktextdll(script)
Return

f(p1, p2) {
	MsgBox % p1 + p2
}

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: ActiveX из AutoHotkey

А, ну фиг его знает. Вот тут написано:

AutoHotkey Module is running in its own context, using separate memory

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: ActiveX из AutoHotkey

Но процесс один.

serzh82saratov пишет:

всё работает.

А нет, дальше вызова DllCall код уже не идёт, зависает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: ActiveX из AutoHotkey

А у меня идёт, MsgBox срабатывает.

AhkCom := ComObjCreate("AutoHotkey.Script") 
result :=  RegisterCallback("f", "Fast")
script = 
(
    DllCall(%result%, "UInt", 11, "UInt", 22) 
) 
AhkCom.ahktextdll(script)
MsgBox, The End
Return

f(p1, p2) {
    MsgBox % p1 + p2
}

19

Re: AHK: ActiveX из AutoHotkey

Нет в Dll не идёт. Второй MsgBox не появляется. Иногда и первый тоже. Строку не возвращает, только UInt. В общем AutoHotkey.dll глючная штука, периодические ошибки памяти.


AhkCom := ComObjCreate("AutoHotkey.Script") 
result :=  RegisterCallback("f", "Fast")
script = 
(
    r := DllCall(%result%, "UInt", 11, "UInt", 22) 
	MsgBox `%r`%
    r := DllCall(%result%, "UInt", 33, "UInt", 44) 
	MsgBox `%r`%
) 
AhkCom.ahktextdll(script) 
Return

f(p1, p2) {
    MsgBox % p1 + p2
	Return p1 + p2
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: ActiveX из AutoHotkey

А чего не спросишь у HotKeyIt?

21

Re: AHK: ActiveX из AutoHotkey

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: ActiveX из AutoHotkey

Ну попытаться всегда стоит.
Обычно он отвечает.

23 (изменено: teadrinker, 2020-10-06 00:35:14)

Re: AHK: ActiveX из AutoHotkey

serzh82saratov пишет:

Строку не возвращает

Я обнаружил, что функции, вызываемые по адресу, полученному через RegisterCallback, не умеют возвращать строки:

addr := RegisterCallback("MyFunc")
MsgBox, % DllCall(addr, "Str")

MyFunc() {
   Return "test"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24 (изменено: YMP, 2020-10-06 08:10:47)

Re: AHK: ActiveX из AutoHotkey

serzh82saratov пишет:

Второй MsgBox не появляется. Иногда и первый тоже.

Если вставляю Sleep перед Return, то оба появляются по два раза. А у вас не так?

25

Re: AHK: ActiveX из AutoHotkey

YMP
А у меня так MsgBox из DLL даже первый не появляется.

f(p1, p2) { 
	Sleep 111
	Return p1 + p2
}

А так появляются оба

f(p1, p2) {   
	Return p1 + p2
}

Но если вставить MsgBox в функцию, то один только MsgBox из DLL, то ни одного.
То есть из за задержки в функции начинает глючить.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26

Re: AHK: ActiveX из AutoHotkey

Нет, я имел в виду Return в основном скрипте.

AhkCom := ComObjCreate("AutoHotkey.Script") 
result :=  RegisterCallback("f", "Fast")
script = 
(
    r := DllCall(%result%, "UInt", 11, "UInt", 22) 
    MsgBox `%r`%
    r := DllCall(%result%, "UInt", 33, "UInt", 44) 
    MsgBox `%r`%
) 
AhkCom.ahktextdll(script)
Sleep, 5000
Return

f(p1, p2) {
    MsgBox % p1 + p2
    Return p1 + p2
}

27

Re: AHK: ActiveX из AutoHotkey

Да, так стабильно работает.
Это получается, что завершение потока вызвавшего ahktextdll что то ломает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: ActiveX из AutoHotkey

Возможно, с завершением потока уничтожаются COM-объекты, им созданные.

29

Re: AHK: ActiveX из AutoHotkey

YMP пишет:

Возможно, с завершением потока уничтожаются COM-объекты, им созданные.

Но нет, не подтверждается. Сейчас проверил на своём объекте — живёт до закрытия скрипта.

30

Re: AHK: ActiveX из AutoHotkey

Malcev пишет:

А чего не спросишь у HotKeyIt?

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31

Re: AHK: ActiveX из AutoHotkey

Лично мне неинтересна, так как не вижу смысла вызывать автохотки из другого языка.

32

Re: AHK: ActiveX из AutoHotkey

Так это только в топике написано, главный смысл это обеспечение стабильной многопоточности в рамках одного процесса.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: ActiveX из AutoHotkey

Зачем для этого мучиться с автохотки.
Не проще ли написать на питоне, например?

34

Re: AHK: ActiveX из AutoHotkey

Ну, блин, не все как ты полиглоты.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35 (изменено: Malcev, 2020-10-06 22:22:01)

Re: AHK: ActiveX из AutoHotkey

Я не полиглот, на питоне только привет мир смог бы написать.
Но там есть хорошая справка + готовые библиотеки, упрощающие жизнь.
Просто с автохотки могут выйти разные казусы, например вот:
https://www.autohotkey.com/boards/viewt … mp;t=74505
24 дня ушло на решение проблемы...

36

Re: AHK: ActiveX из AutoHotkey

Malcev пишет:

Просто с автохотки могут выйти разные казусы


Про то и разговор, есть глюки с AutoHotkey_H, ты предложил написать автору, чтобы их решить. Я предложить сделать это более компетентным людям.

Питон конечно хорошо, но суть анк в более простой реализации большинства вещей, и может ради серьёзного проекта конечно стоит изучить что то другое. Но, например когда уже есть много кода, и хочется в нём вывести что то в отдельный поток, то ради этого не особо рационально переписывать весь код на неизвестном языке.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37

Re: AHK: ActiveX из AutoHotkey

Malcev пишет:

24 дня ушло на решение проблемы...

А причём там анк, там же оказалось дело в стороннем софте.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

38

Re: AHK: ActiveX из AutoHotkey

А я и не винил ahk, я к тому, что AHK H мало, кто активно использует, поэтому и решается всё небыстро.
И мне, если честно, совсем не хочется искать баги и писать баг-репорты по этому продукту.
Я для многопоточности использую старый код от teadrinker и он меня вполне устраивает.
http://forum.script-coding.com/viewtopic.php?id=10765
Посмотрел справку - твой код у меня так работает.

AhkCom := ComObjCreate("AutoHotkey.Script") 
result :=  RegisterCallback("f", "Fast")
script = 
(
    r := DllCall(%result%, "UInt", 11, "UInt", 22) 
    MsgBox `%r`%
    r := DllCall(%result%, "UInt", 33, "UInt", 44) 
    MsgBox `%r`%
) 
AhkCom.ahktextdll(script)
While AhkCom.ahkReady()
   Sleep 100
Return

f(p1, p2) {
    MsgBox % p1 + p2
    Return p1 + p2
}

39

Re: AHK: ActiveX из AutoHotkey

Malcev пишет:

А я и не винил ahk

Мысль понял, просто пример не корректен, такое могут где угодно сколько угодно решать.
Если автор отвечает, но мало кто пользуется, то это тоже влияет на развитие проекта, никто не пишет, нечего и решать.
Можно как тебе удобно через OnMessage, мне удобнее RegisterActiveObject, но если маячит вариант удобнее, то это будет всегда лучше чем привычное.

Malcev пишет:

While AhkCom.ahkReady()

Да, я думал что это просто для дальнейшего выполнения основного кода, справка скудная, но как выявил YMP это является условием для корректного выполнения ahktextdll.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

40 (изменено: serzh82saratov, 2020-10-07 14:57:14)

Re: AHK: ActiveX из AutoHotkey

Строки наверное только так передавать.
А как передать дробное?


script = 
( %
    r := DllCall(pf1, "Int", 11, "Int", 22, "Float") 
    MsgBox % r 
    r := DllCall(pf2, "Str", "String ", "UInt", 33, "Ptr") 
    MsgBox % StrGet(r)
)   
AhkCom := ComObjCreate("AutoHotkey.Script") 
AhkCom.ahkassign("pf1", RegisterCallback("f1", "Fast")) 
AhkCom.ahkassign("pf2", RegisterCallback("f2", "Fast")) 
AhkCom.ahktextdll(script)
While AhkCom.ahkReady()
   Sleep 100 
Return
	
f1(p1, p2) {  
    Return p1 / p2
}

f2(p1, p2) {
    str := StrGet(p1) p2
	StrPut(str, &r) 
    Return &r
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

41

Re: AHK: ActiveX из AutoHotkey

Возвращение строки ещё вот так работает:


addr := RegisterCallback("MyFunc")
MsgBox, % DllCall(addr, "Str")

MyFunc() {
    static test := "test"
    Return &test
}

42

Re: AHK: ActiveX из AutoHotkey

Дробное получается вернуть на 64 битах как Double, но на 32-х почему-то не срабатывает.


addr := RegisterCallback("MyFunc")
MsgBox, % DllCall(addr, "int", 11, "int", 22, "Double")

MyFunc(p1, p2) {
    Return p1 / p2 + 0.0
}

43

Re: AHK: ActiveX из AutoHotkey

Всё, что угодно можно передавать, как обычно в DllCall, через буфер:


addr := RegisterCallback("MyFunc")
VarSetCapacity(buff, 256, 0)
DllCall(addr, "int", 11, "int", 22, "Ptr", &buff)
MsgBox, % NumGet(buff, "Double") "`n" StrGet(&buff + 8)

MyFunc(p1, p2, pBuff) {
    NumPut(p1 / p2, pBuff + 0, "Double")
    StrPut("Hello, World!", pBuff + 8)
    Return true
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

44

Re: AHK: ActiveX из AutoHotkey

Собственно, в справке сказано, что напрямую можно возвращать только целые числа.

If the function uses Return without any parameters, or it specifies a blank value such as "" (or it never uses Return at all), 0 is returned to the caller of the callback. Otherwise, the function should return an integer, which is then returned to the caller.

То, что мой код выше возвращает дробное на 64 битах, видимо, случайность. Просто в регистре xmm0, который должен использоваться для возвращаемого дробного, остаётся результат вычисления p1/p2.

45

Re: AHK: ActiveX из AutoHotkey

YMP пишет:

Собственно, в справке сказано, что напрямую можно возвращать только целые числа.

Разве это не про значение по умолчанию?
Если не указано, то UInt.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

46

Re: AHK: ActiveX из AutoHotkey

teadrinker пишет:

VarSetCapacity(buff, 256, 0)

А почему размер 256 а не 1?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

47 (изменено: serzh82saratov, 2020-10-07 23:11:34)

Re: AHK: ActiveX из AutoHotkey

Malcev пишет:

Посмотрел справку - твой код у меня так работает.

ahkReady тут видимо не причём. Так отлично работает. Значит дело было только в "неправильном" вызове DllCall.


script = 
( %
	VarSetCapacity(buff, 1, 0)
	Loop 
	{
	    r := DllCall(addr, "int", A_Index, "int", 22, "Ptr", &buff)
		MsgBox, % NumGet(buff, "Float") "``n" StrGet(&buff + 8) 
	}
)   
AhkCom := ComObjCreate("AutoHotkey.Script") 
AhkCom.ahkassign("addr", RegisterCallback("MyFunc")) 
AhkCom.ahktextdll(script) 
Return
	
MyFunc(p1, p2, pBuff) {
    NumPut(p1 / p2, pBuff + 0, "Float")
    StrPut("Hello, World!", pBuff + 8)
    Return true
}

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

48 (изменено: teadrinker, 2020-10-07 23:12:05)

Re: AHK: ActiveX из AutoHotkey

serzh82saratov пишет:

А почему размер 256 а не 1?

А почему должен быть 1? Размер должен быть как минимум равен содержимому. Если меньше, то нет гарантии, что данные сохранятся, или не испортят чего-нибудь другого при записи.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

49

Re: AHK: ActiveX из AutoHotkey

Note: the variable will auto-expand if the script assigns it a larger value later.

Так она разве не автоматически увеличивается под содержимое? На практике вроде всегда всё влезает.

Since this function is often called simply to ensure the variable has a certain minimum capacity

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

50

Re: AHK: ActiveX из AutoHotkey

Это было бы так, если бы мы изменяли её содержимое, присваивая другое значение через var := "newValue". В таком случае, если новое значение требует большей вместимости, указатель на переменную может измениться.

var := "a" 
ptr1 := &var
var := "abcd"
ptr2 := &var
MsgBox, % ptr1 "`n" ptr2
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

51

Re: AHK: ActiveX из AutoHotkey

То есть в коде 43 надо по хорошему перед StrPut проверять размер данных, и если они больше буфера, то увеличивать буфер, если меньше, то оставлять буфер как есть.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

52

Re: AHK: ActiveX из AutoHotkey

Проще всего через HeapAlloc/HeapReAlloc.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

53

Re: AHK: ActiveX из AutoHotkey

YMP пишет:

Возвращение строки ещё вот так работает:


addr := RegisterCallback("MyFunc")
MsgBox, % DllCall(addr, "Str")

MyFunc() {
    static test := "test"
    Return &test
}

Helgef, писал, что так нельзя возвращать адрес в локальных функциях.

Local variables are for use only when the function executes. You have no guarantees after the function returns. For example, this will fail,

value := 1.000000000000011
msgbox % numget(_cvScalar(value), 0, "double") == value

_cvScalar(value)
{
   VarSetCapacity(vScalar, 8, 0)
   NumPut(value, vScalar, 0, "double")
   return &vScalar
}

It fails because when the function returns, it stores an empty string at the address you return, overwriting the first (two) byte(s) with the zero terminator.
You can use byref,

54

Re: AHK: ActiveX из AutoHotkey

serzh82saratov пишет:

Разве это не про значение по умолчанию?
Если не указано, то UInt.

Нет, там вполне однозначно, по-моему. Если возврата нет, он пустой или пустая строка, тогда возвращается 0. Иначе функция должна возвращать целое.

55

Re: AHK: ActiveX из AutoHotkey

Malcev пишет:

Helgef, писал, что так нельзя возвращать адрес в локальных функциях.

Local variables are for use only when the function executes. You have no guarantees after the function returns.

Так у меня же не просто локальная, а статическая переменная. Они сохраняются между вызовами функции, для того и предназначены.

56

Re: AHK: ActiveX из AutoHotkey

Не вижу разницы:

value := 1.000000000000011
msgbox % numget(_cvScalar(), 0, "double") == value

_cvScalar()
{
   static value := 1.000000000000011
   VarSetCapacity(vScalar, 8, 0)
   NumPut(value, vScalar, 0, "double")
   return &vScalar
}

57

Re: AHK: ActiveX из AutoHotkey

vScalar — не статическая.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

58

Re: AHK: ActiveX из AutoHotkey

А, понял.
Спасибо!

59 (изменено: teadrinker, 2020-10-11 19:49:05)

Re: AHK: ActiveX из AutoHotkey

Ещё интересный вариант с созданием callback-функции из BoundFunc-объекта:

BoundObj := Func("JoinStrings").Bind(Ret := [])
Clbk := new BoundFuncCallback(BoundObj, 2, "Fast")

DllCall(Clbk.addr, "Str", "Hello, ", "Str", "World!")
MsgBox, % Ret[1]

JoinStrings(Ret, pStr1, pStr2) {
   Ret[1] := StrGet(pStr1) . StrGet(pStr2)
   Return true ; при вызове через адрес можно вернуть только число
}

class BoundFuncCallback
{
   __New(BoundFuncObj, paramCount, options := "") {
      this.pInfo := Object( {BoundObj: BoundFuncObj, paramCount: paramCount} )
      this.addr := RegisterCallback(this.__Class . "._Callback", options, paramCount, this.pInfo)
   }
   __Delete() {
      ObjRelease(this.pInfo)
      DllCall("GlobalFree", "Ptr", this.addr, "Ptr")
   }
   _Callback(Params*) {
      Info := Object(A_EventInfo), Args := []
      Loop % Info.paramCount
         Args.Push( NumGet(Params + A_PtrSize*(A_Index - 2)) )
      Return Info.BoundObj.Call(Args*)
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

60

Re: AHK: ActiveX из AutoHotkey

Немного упростил.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder