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: 16788 
	
		
	 | 
	
		
 | 
	| 13.02.2012 20:45 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
			
			 
			
				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: 16788 
	
		
	 | 
	
		
 | 
	| 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: 16788 
	
		
	 | 
	
		
 | 
	| 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: 16788 
	
		
	 | 
	
		
 | 
	| 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: 16788 
	
		
	 | 
	
		
 | 
	| 16.02.2012 12:11 | 
	
		
	 |