1 (изменено: Clannad5, 2022-07-31 23:31:10)

Тема: 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 на неактивность.