Ребят, там же код проще паренной репы. Из-за того геморроя, что творится в плюсах с импортом/экспортом (в delphi статический импорт функции без *.lib — одна строка) используется, как и в большинстве решений, динамический импорт через GetProcAddress. Единственное, что должно смущать — описатель hEra брался из v1 (решение плохое, глобальная переменная вместо вызова LoadLibrary), что объявлено устаревшим, но для пущей совместимости я теперь всегда v1 инициализирую в hEra даже для библиотек с расширением *.dll. *.dll плагины были для Эры 1.х, они вызывались после события OnAfterWoG и не использовали более новых функций. *.era плагины вызываются до события OnBeforeWoG.
Стоит, конечно, решить этот вопрос и вообще перестать грузить *.dll плагины, а также перестать наглухо зависеть от v1. Это не делалось из-за обратной совместимости. В старых dll-плагинах не было событий, никто не знал, когда их загрузят, патчи применялись прямо из DllMain. Реально они грузились после кода Вога и применения патчей Вога. Если их переименовать в *.era, они загрузятся ещё ДО кода вога и могут сильно засбоить.
// Теперь все перекомпилировать, блин.
Перекомпиляция занимает пару секунд, если есть исходники и студия, нет? Я по десятку раз проекты пересобираю к релизу ) Но лучше просто на github папку с исходниками кинуть.
igrik, два вопроса не связаны.
1) События регистрируются, если нужно их обрабатывать. Нельзя делать что-то важное в DllMain (работа с потоками, загрузка других dll, которые ещё не в памяти).
Поэтому если код ставит патчи, грузит потенциально незагруженные библиотеки или обрабатывает конкретные события, то ему нужно подписаться на конкретное событие (OnAfterWoG, скажем). Любое событие сработает уже после того, как библиотека плагина и системный код провели полную инициализацию.
2) Адреса функций сохраняются в переменные, чтобы не дёргать медленный поиск по загруженным библиотекам (LoadLibraryA => LoadLibraryExW => LdrLoadLibrary | что-то там для поиска) для каждого вызова с последующим насилием на секцией экспорта библиотеки (GetProcAddress).
Один вызов ConnectEra из DllMain все указатели на функции заполняет.
3) GetEraVersion можно вызвать прямо в том месте, где это нужно, эм, через уже ранее инициализированный указатель
.
XEPOMAHT, если куча битых функций (адрес 0), значит библиотека имела неверное расширение, *.dll вместо *.era.
Загрузи, пожалуйста, пример одной dll, которая в 2.7.7 работает корректное, а в 2.8.2 нет. Причина, скорее всего банально, над комплексным решением подумаю.