(25.08.2024 06:03)Berserker Wrote: По идее пустые подсказки (нулевой адрес) вообще не должны быть.
Не должно, но я уже потерялся в догадках, почему код era.dll не работает аналогично воговскому коду на добавление подсказки. Саму переменную в стеке, где хранится адрес подсказки, Тифон никак не меняет. Значение из переменой уходит на функцию AddHint(iid,hint); и доходит до эровского хука, а дальше... после эры Body->Hints[i].Text превращается в тыкву
(25.08.2024 06:03)Berserker Wrote: В коде вога проверка:
if(hint[0]!=0) AddHint(iid,hint);
Да, игра бы здесь сразу вылетела, недоходя до хука эры, если бы вместо адреса был 0.
(25.08.2024 06:03)Berserker Wrote: Ты передаёшь нулевой? Я тогда сделаю нулевой адрес аналогом #0.
Нет, 0 может зайти только с загрузчика текстовика шаблона диалога, но там тоже не может быть 0. Остаётся только то, что команда Utils.CopyMem(NewHintSize, NewHint, NewHintCopy); из ЭРЫ на Windows 2003 тупо не работает или команда Heroes.MemAlloc(NewHintSize) из ЭРЫ не может выделить память под динамические массивы (возможно, что эровские динамические массивы вместе с ERA+ не работают вообще никак, т.к. они в ERA+ никогда не использовались).
Если что и можно - добавить в era.dll проверку на true после выполнения Heroes.MemAlloc(NewHintSize), в случае false выполнять полный аналог воговского кода, который был подменён хуком. Т.к. похоже, что в ERA+ Heroes.MemAlloc(NewHintSize) всегда заканчивается неудачей и хук на выгрузку просто не может выгрузить нулевую память после неудачной Heroes.MemAlloc.