kostya_76
Posts: 33
|
(12.02.2012 21:43)baratorch Wrote: kostya_76
__stdcall void замени на void __stdcall
Да, теперь копмилится. правда кучу предупреждений выдает:
При загрузке длл вот такая штука выскакивает:
Хотя и работает впоследствии: обЪекты удаляются в игре.
|
|
12.02.2012 22:01 |
|
kostya_76
Posts: 33
|
А при попытке создания хука ошибки линковщика:
|
|
13.02.2012 00:39 |
|
Sav
Posts: 2180
|
Мне для работы пришлось переименовать era.cpp в era.h.
|
|
13.02.2012 00:54 |
|
kostya_76
Posts: 33
|
(13.02.2012 00:54)Sav Wrote: Мне для работы пришлось переименовать era.cpp в era.h.
От появления предупреждений при линковке это действительно избавило. Но не более того.
От ошибок линковщика, приведенных на последнем скрине удалось избавиться, убрав галочки "Use VCL" и "Multi Threaded" при создании шаблона библиотеки мастером.
Но хук не создается, и вообще секции этой длл в памяти не появляются.
В предыдущем примере с удалением объектов с помощью ЕРМ-инструкций также в памяти длл не видно, но тем не менее объекты удаляются.
|
|
13.02.2012 18:25 |
|
Berserker
Posts: 16657
|
|
13.02.2012 20:45 |
|
Berserker
Posts: 16657
|
http://wikisend.com/download/364322/SDK.rar
Переписан заголовочный файл, обновлён пример, добавлена демонстрация установки перехватчика.
Code:
#include <windows.h>
#include "Era.h"
using namespace Era;
const int ADV_MAP = 37;
const int CTRL_LMB = 4;
const int LMB_PUSH = 12;
void __stdcall OnAdventureMapLeftMouseClick (TEvent* Event)
{
ExecErmCmd("CM:I?y1 F?y2 S?y3;");
if ((y[1] == ADV_MAP) && (y[2] == CTRL_LMB) && (y[3] == LMB_PUSH))
{
ExecErmCmd("CM:R0 P?y1/?y2/?y3;");
ExecErmCmd("UN:Ey1/y2/y3;");
if (f[1])
{
ExecErmCmd("UN:Oy1/y2/y3/1;");
ExecErmCmd("IF:L^{~red}Object was deleted!{~}^;");
}
}
}
BOOL __stdcall Hook_BattleMouseHint (THookContext* Context)
{
ExecErmCmd("IF:L^{~gold}This is a battle hint!{~}^;");
return EXEC_DEF_CODE;
}
extern "C" __declspec(dllexport) BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
ConnectEra();
RegisterHandler(OnAdventureMapLeftMouseClick, "OnAdventureMapLeftMouseClick");
ApiHook((void*) Hook_BattleMouseHint, HOOKTYPE_BRIDGE, (void*) 0x74fd1e);
}
return TRUE;
};
Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
|
|
13.02.2012 22:50 |
|
kostya_76
Posts: 33
|
Berserker, Все равно не получается )
В смысле, компилится нормально, только это предупреждение также осталось:
[C++ Warning] Era.h(130): W8058 Cannot create pre-compiled header: initialized data in header
При запуске то же сообщение: И в памяти, соответственно , длл не появляется.
Может я что-то не так делаю? Бросаю созданную длл в папку EraPlagins. Все остальные плагины работают.
|
|
14.02.2012 00:12 |
|
Berserker
Posts: 16657
|
|
14.02.2012 01:38 |
|
kostya_76
Posts: 33
|
(14.02.2012 01:38)Berserker Wrote: Плагин должен иметь расширение *.era. Ну а предупреждение компилятора нормальное.
На работоспособные длл изменение расширения на .era никак не влияет: работают и так и так.
А вот в данном примере смена расширения приводит к вылету после сообщения об исключении.
Если в DllMain оставить только вызов ConnectEra() , тогда нормально загружается.
Berserker, а ты пробовал сам скомпилировать и запустить этот пример? Работает?
(This post was last modified: 14.02.2012 16:29 by kostya_76.)
|
|
14.02.2012 16:03 |
|
Berserker
Posts: 16657
|
|
14.02.2012 17:02 |
|
kostya_76
Posts: 33
|
(14.02.2012 17:02)Berserker Wrote: kostya_76, да, причём как часы. 20 КБ размер выходит.
Это, я так понимаю, в GNU компилилось , а не в билдере? У меня весит 9 КБ.
(14.02.2012 17:02)Berserker Wrote: Не так. *.dll - это старые плагины, *.era - новые. Новые грузятся ДО вога и основаны на системе событий.
В данном примере это принципиально? Пример на Делфи прекрасно работает без переименований.
(14.02.2012 17:02)Berserker Wrote: А вы вообще на какой версии эры экспериментируете? Я видел в пути WT.
Era 1.9, экзешник насколько помню потом еще отдельно скачивал.
А установлено в папку с WT.
|
|
14.02.2012 17:20 |
|
Berserker
Posts: 16657
|
|
14.02.2012 17:52 |
|
kostya_76
Posts: 33
|
(14.02.2012 17:52)Berserker Wrote: Я не знаю, что там чудим билдер, но суть проста. Era.dll загружается, получаются адреса её функций и вызываются. Если мне предоставится возможность проверить на билдере, я попробую. Дома его нет.
Для меня это не так уж просто) Попробую еще поковыряться в опциях. Можно еще мап-файл поизучать)
(This post was last modified: 14.02.2012 18:21 by kostya_76.)
|
|
14.02.2012 18:20 |
|
kostya_76
Posts: 33
|
Berserker, Если поменять hEra = (HINSTANCE) v[1]; на hEra = LoadLibrary("era.dll");,
то все работает, кроме функции ApiHook - Вероятно ее нет в библиотеке)
А Функция Hook работает, ну и остальные вроде тоже.
Адрес hEra указывал куда-то в середину секции, и в результата все GetProcAddress возвращали нули.
|
|
16.02.2012 02:56 |
|
Berserker
Posts: 16657
|
|
16.02.2012 12:11 |
|