1

Тема: AHK: Исполнение кода из стороннего файла

Добрый день.
Возможно ли в AHK исполнение кода из стороннего файла? (Имеется ввиду чтение некоторого кода из файла и исполнение его в рабочем (если возможно, то в скомпилированном) скрипте).

2

Re: AHK: Исполнение кода из стороннего файла

Да, возможно через AutoHotkey.dll, гуглите.

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

3

Re: AHK: Исполнение кода из стороннего файла

Спасибо, щас попробую)

4 (изменено: Ladanu_ML, 2024-07-15 16:42:18)

Re: AHK: Исполнение кода из стороннего файла

teadrinker

! Проблему решил, нужно было просто вынести LoadLibrary за цикл !



При запуске этого кода на AHK_H выдает ошибки (Exit code: 3221226525, Exit code: 3221225477, Exit code: 3221226356):


#SingleInstance Force

Loop {
	FileRead, Read, test.txt
	if RegExMatch(Read, "123") {
		dllpath := A_WorkingDir . "\AutoHotkey.dll"
		DllCall("LoadLibrary", "Str", dllpath)
		Code =
		(
		#SingleInstance, Force
		
		Function_Run() {
			SoundBeep, 500
		}

		Function_Run()
		While DllCall(dllpath "\ahkReady") {
			Sleep, 100
		}
		)
		dll := DllCall(dllpath "\ahktextdll","Str",Code,"Str","","Str","","CDecl")
		VarSetCapacity(dll, 0)
		FileDelete, test.txt
		continue
	}
}

-::
FileAppend, 123, test.txt
return

Не знаете, в чем может быть дело? (ошибка появляется после 2-5 запуска нового потока)

5

Re: AHK: Исполнение кода из стороннего файла

Я уже не пишу на AHK v1, лень разбираться.
Должно быть так:

script =
(
    #NoTrayIcon
    counter := 0
    Loop 30 {
        ToolTip `% ++counter
        Sleep 100
    }
)

; битность dll должна соответствовать битности скрипта, в котором она загружается
dllPath := A_ScriptDir . "\AutoHotkey.dll"
if !DllCall("LoadLibrary", "Str", dllpath) {
    MsgBox Не удалось загрузить AutoHotkey.dll
}
DllCall(dllpath . "\ahktextdll", "Str", script, "Str", "", "CDecl")
While DllCall(dllpath . "\ahkReady") {
    Sleep 100
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Исполнение кода из стороннего файла

Этот цикл

While DllCall(dllpath . "\ahkReady") {
    Sleep 100
}

нужен только для того, чтобы основной скрипт не завершился раньше, чем тот, который запускается через dll. Вместо этого можно просто добавить в начало #Persistent:

#Persistent
script =
(
    #NoTrayIcon
    counter := 0
    Loop 30 {
        ToolTip `% ++counter
        Sleep 100
    }
)

; битность dll должна соответствовать битности скрипта, в котором она загружается
dllPath := A_ScriptDir . "\AutoHotkey.dll"
if !DllCall("LoadLibrary", "Str", dllpath) {
    MsgBox Не удалось загрузить AutoHotkey.dll
}
DllCall(dllpath . "\ahktextdll", "Str", script, "Str", "", "CDecl")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder