[Вопрос] Помогите пофиксить краши из-за диалогового окна АХК
|
|
trenisk |
Дата: Понедельник, 05.02.2018, 19:25 | Сообщение # 1
|
Любитель
Сообщений: 42
Статус: Offline
|
Всем привет. Недавно нашел диалог, которые сделан через АХК, и настроил под себя. На данный момент там 563 строки, но как я заметил, игра начала крашить/зависать. Помогите пожалуйста решить проблему. Вот краткий пример скрипта(у меня же несколько диалогов c измененным содержимым текстом): Код if !A_IsAdmin && !%False% { if A_OSVersion not in WIN_2003,WIN_XP,WIN_2000 { Run *RunAs "%A_ScriptFullPath%" ,, UseErrorLevel if !ErrorLevel ExitApp } MsgBox 0x31, Ошибка запуска, ( Для правильной работы программы в GTA:SA:MP нужны права Администратора.`nПродолжить в любом случае, нажмите "OK". Для отмены нажмите "Cancel". ( Может ничего не работать. ) ) IfMsgBox Cancel ExitApp } #include %A_ScriptDir%\samp-udf.ahk ; Инклуд #NoEnv ; Для стабильности работы скрипта #IfWinActive ahk_group Game GroupAdd, Game, GTA:SA:MP GroupAdd, Game, MTA: San Andreas GroupAdd, Game, Multi Theft Auto GroupAdd, Game, GTA: San Andreas LineResult() { if (!isDialogOpen() || getDialogStyle() = 0 || getDialogStyle() = 1 || getDialogStyle() = 3) return false while (isDialogOpen()) continue if(GetKeyState("Esc", "P")) return false return getDialogLineNumber() }
F3:: ShowDialog("2", "Помощь по функциям | {FF0000}Author: Madrasso", "Пример 1`nПример 2", "Выбрать", "Закрыть") Result := LineResult() if (!Result) return Gosub, Label%Result% return Label1: { ShowDialog("2", "Пример 1 | {FF0000}Author: Madrasso", "Пример 1.1`nПример 1.2", "Выбрать", "Закрыть") Result := LineResult() if (!Result) return Gosub, primer1%Result% return } Label2: { ShowDialog("2", "Пример 2 | {FF0000}Author: Madrasso", "Пример 2.1`nПример 2.2", "Выбрать", "Закрыть") Result := LineResult() if (!Result) return Gosub, primer2%Result% return } primer11: ShowDialog("1", "Пример 1.1 | {FF0000}Author: Madrasso", "[Пример 1.1]", "Выбрать", "Закрыть") input, text228, V, {enter} KeyWait Enter, D sendchat("" getDialogText() ": " text228 " ") return primer12: ShowDialog("1", "Пример 1.2 | {FF0000}Author: Madrasso", "[Пример 1.2]", "Выбрать", "Закрыть") input, text228, V, {enter} KeyWait Enter, D sendchat("" getDialogText() ": " text228 " ") return primer21: ShowDialog("1", "Пример 2.1 | {FF0000}Author: Madrasso", "[Пример 2.1]", "Выбрать", "Закрыть") input, text228, V, {enter} KeyWait Enter, D sendchat("" getDialogText() ": " text228 " ") return primer22: ShowDialog("1", "Пример 2.2 | {FF0000}Author: Madrasso", "[Пример 2.2]", "Выбрать", "Закрыть") input, text228, V, {enter} KeyWait Enter, D sendchat("" getDialogText() ": " text228 " ") return
Сообщение отредактировал trenisk - Понедельник, 05.02.2018, 19:32 |
|
|
|
Wyareri |
Дата: Понедельник, 05.02.2018, 21:13 | Сообщение # 2
|
Боец
Сообщений: 56
Статус: Offline
|
Насколько я знаю это нельзя пофиксить вроде бы из-за разности кодировок САМПа, и АХК. Сколько лазил по всяким форумам - так ответа и не нашёл.
|
|
|
|
Rinat_Namazov |
Дата: Понедельник, 05.02.2018, 22:14 | Сообщение # 3
|
Боец
Сообщений: 122
Статус: Offline
|
Цитата Wyareri ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/4/lastpost.gif) ) из-за разности кодировок САМПа, и АХК. Бред.
Цитата trenisk ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/4/lastpost.gif) ) игра начала крашить/зависать Более мене сложные функции в SAMP UDF по типу ShowDialog работают по принципу: NumPut + writeRaw + createRemoteThread + waitForSingleObject + closeProcess А это выделение памяти и создание временного потока для вызова какой-либо функции. Можно скомпилировать AHK в *.dll формат в компиляторе AHK_H и заинжектить в процесс gta_sa.exe Но для этого нужно переписать систему вызова функций диалога, и крашит естественно перестанет.
Заинжектить можно любым инжектором, даже который написан на AHK в формате *.exe
Сообщение отредактировал Rinat_Namazov - Понедельник, 05.02.2018, 22:16 |
|
|
|
trenisk |
Дата: Понедельник, 05.02.2018, 23:47 | Сообщение # 4
|
Любитель
Сообщений: 42
Статус: Offline
|
Цитата Rinat_Namazov ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/4/lastpost.gif) ) Но для этого нужно переписать систему вызова функций диалога, и крашит естественно перестанет. Можете предоставить инструкцию пожалуйста?
|
|
|
|
Rinat_Namazov |
Дата: Понедельник, 05.02.2018, 23:57 | Сообщение # 5
|
Боец
Сообщений: 122
Статус: Offline
|
Цитата trenisk ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/4/lastpost.gif) ) Можете предоставить инструкцию пожалуйста? Этим никто не занимался, и инструкции естественно нет. Как новичку, для вас это будет сложновато.
Посоветую только ставить задержку перед вызовом диалога миллисекунд 200 где-то, а также использовать функцию AntiCrash() из UDF.
|
|
|
|
trenisk |
Дата: Вторник, 06.02.2018, 12:30 | Сообщение # 6
|
Любитель
Сообщений: 42
Статус: Offline
|
Цитата Rinat_Namazov ( ![Ссылка на цитируемый текст](/.s/img/fr/ic/4/lastpost.gif) ) ставить задержку перед вызовом диалога миллисекунд 200 где-то, а также использовать функцию AntiCrash() из UDF Не помогло ![sad](/.s/sm/2/sad.gif) Добавлено (06.02.2018, 12:30) --------------------------------------------- Проблема еще не решена. up
|
|
|
|
Rinat_Namazov |
Дата: Вторник, 06.02.2018, 16:43 | Сообщение # 7
|
Боец
Сообщений: 122
Статус: Offline
|
Нельзя вызвать диалоги очень часто, поэтому между вызовами диалога нужна задержка, а также используй функцию антикраша перед и после(Так то хватит и один вызов этой функции, ну мы незнаем запустили ли скрипт раньше чем самп).
Можешь не ждать, ничего лучше того что я написал выше не предложат.
|
|
|
|
Joni228 |
Дата: Четверг, 08.02.2018, 09:41 | Сообщение # 8
|
Бывалый
Сообщений: 314
Статус: Offline
|
Смотрите свой код, возможно где то допустили ошибку!
|
|
|
|