Тема: AHK: Способ получения данных с dll скрипта Ahk
Здравствуйте!
У меня имеется два скрипта, один преобразован в .exe формат, другой в .dll формат.
С помощью .exe скрипта я вызываю Dll скрипт и тот начинает работать.
Вот код первого скрипта Untitled.exe:
global hModule
f10::
SetTimer, ErrorSend, On
SetTimer, ErrorSend, 10000
;избегает загрузки библиотеки в цикле
hModule := DllCall("LoadLibrary", "str", "msg.dll")
OnMessage(CloseMyScript, "CloseScriptMonitor") ; мониторим наше сообщение
return
ErrorSend:
DllCall("FreeLibrary", "UInt", hModule)
SetTimer, ErrorSend, Off
return
CloseScriptMonitor()
{
SetTimer, ErrorSend, 10000
SoundBeep, 100, 800
SetTimer, ErrorSend, 10000
}
return
Вот код второго скрипта msg.dll:
SetTimer, ErrorSend, 5000
Loop, 10
{
SoundBeep, 500, 500
Sleep, 2000
}
ExitApp
return
ErrorSend:
DetectHiddenWindows, On ; искать в скрытых окнах
PostMessage, CloseMyScript,,,, % "ahk_exe" "Untitled.exe"
return
Все эти файлы компилируются AHK Protector'ом mini: https://www.blast.hk/threads/22092/
Благодаря этому протектору, я могу выгружать dll файл, при этом скрипт не крашит.
Но есть одна проблема.
Если выгрузить dll в момент, пока скрипт не завершил своё состояние чекрез ExitApp
DllCall("FreeLibrary", "UInt", hModule)
То скрипт крашнет.
Но если dll завершил свою работу через ExitApp, то dll может быть спокойна выгружена и скрипт не крашнется.
Проблема у меня с PostMessage и OnMessage.
При первом запуске dll на F10, dll запускает таймер и спокойно передаёт информацию о своей работоспособности, тем самым не давая скрипту преждевременно выгрузить dll.
Когда dll заканчивает свою работу, он обязательно должен выйти из него через ExitApp, но иногда dll может просто вылетить, при этом оставляя msg.dll в процессе.
Поэтому я и придумал подобную проверку с таймеров в 10 секунд. Если в течение 10 секунд сигнал от dll не поступает, значит dll либо крашнулся, либо закончил свою работу и можно его выгружать из процесса.
Хотелось бы получить совет как лучше это реализовать, т.к после второго запуска скрипта на F10, dll должен отправлять запросы .exe скрипту, но по непонятным мне причинам, он этого не делает.
В голове крутится способ изменять в текстовике значение каждый раз на +1, чтобы если он не изменился - значит dll не работает.
Не знаю как еще можно проверить dll на неактивность.