Программинг Форум для тем связанных с программированием
09.06.2011, 02:41
#1
Пользователь
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
Функция RequestBypassToServer
Доброе время суток. Уважаемы гуру, прошу помощи у вас, ибо сам уже зашел в тупик.
Как, используя функцию RequestBypassToServer из engine.dll, отправить некоторый пункт ответа в диалоге с НПС?
Или, если быть точнее, как работать с классом L2ParamStack?
Хроники Грация Финал.
Буду очень признателен за любую помощь, а то уже несколько дней бьюсь как рыба об лед.
09.06.2011, 10:37
#2
Пользователь
Регистрация: 19.07.2010
Сообщений: 45
Сказал Спасибо: 10
Имеет 23 спасибок в 12 сообщенях
Цитата:
Сообщение от
maxilam
...
Или, если быть точнее, как работать с классом L2ParamStack?
...
Я обычно работаю так:
Адреса процедур:
Код:
AdrL2StackCreate:=adrProc('core.dll','??0L2ParamStack@@QAE@H@Z');
AdrL2StackClear :=adrProc('core.dll','?Clear@L2ParamStack@@QAEXXZ');
AdrL2StackPushBack:=adrProc('core.dll','?PushBack@L2ParamStack@@QAEHPA_W@Z'); //freya ?PushBack@L2ParamStack@@QAEHPAG@Z
AdrL2StackTop :=adrProc('core.dll','?Top@L2ParamStack@@QAE_JXZ'); //?Top@L2ParamStack@@QAEPAXXZ
AdrL2StackFree :=adrProc('core.dll','??1L2ParamStack@@QAE@XZ');
Вызов:
Код:
procedure l2stackCreate; //создать стек параметров
asm
push ecx
mov ecx, UnKnown
push 0Ah
call AdrL2StackCreate
pop ecx
end;
procedure L2StackPushBack; //положить параметр в стек параметров
begin
asm
mov ecx,param
push ecx
mov ecx, UnKnown
call AdrL2StackPushBack
end;
...
Пример работы:
Код:
asm
call l2stackcreate
call l2stackclear
mov eax, ObjectID
mov param,eax
call L2StackPushBack
mov eax, 0
mov param,eax
call L2StackPushBack
call l2useItem
call l2stackfree
end;
Последний раз редактировалось Guzh, 09.06.2011 в 10:42 .
За это сообщение Guzh нажился 6 спасибками от:
11.06.2011, 10:09
#3
Пользователь
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
Код:
procedure l2stackCreate; //создать стек параметров
asm
push ecx
mov ecx, UnKnown
push 0Ah
call AdrL2StackCreate
pop ecx
end;
Поток завершается без ошибк при вызове AdrL2StackCreate;
Что должно находиться в ecx?
Разобрался.
строка
Должна быть вида
Код:
mov ecx, L2ParamStack
где L2ParamStack указатель на array[0..16] of byte
Последний раз редактировалось maxilam, 11.06.2011 в 14:00 .
За это сообщение maxilam нажился 2 спасибками от:
06.11.2011, 23:29
#4
Пользователь
Регистрация: 04.11.2009
Сообщений: 44
Сказал Спасибо: 57
Имеет 3 спасибок в 2 сообщенях
Цитата:
Сообщение от
maxilam
строка
Должна быть вида
Код:
mov ecx, L2ParamStack
где L2ParamStack указатель на array[0..16] of byte
delphi Код:
type ArrL2ParamStack = array[0 ..16 ] of Byte ;
var L2ParamStack: ^ArrL2ParamStack;
procedure L2StackCreate;
asm
push ecx
mov ecx, L2ParamStack
push 0Ah
call AdrL2StackCreate
pop ecx
end ;
Сделал как написано выше, все равно клиент вылетает при вызове L2StackCreate. Можете еще привести примеры успешной работы с этим зверем "класс L2ParamStack". И что делает метод L2ParamStack::Top(void)?
07.11.2011, 00:57
#5
Пользователь
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
В кратце пример работы (вроде лишнего ни чего не повырезал )) ):
Код:
type
TL2ParamStack = array[0..16] of byte;
PL2ParamStack = ^TL2ParamStack;
TL2Param = class
l2p: PL2ParamStack;
public
constructor Create;
destructor Destroy;
procedure l2PushBack(cmd: string);
procedure l2PushBackInt(i: integer);
procedure l2Clear;
procedure l2Free;
end;
...
var
L2ParamStackCreate_Original: procedure(i: integer); stdcall;
L2ParamStackClear_Original: procedure; stdcall;
L2ParamStackPushBack_Original: function(i: pointer): integer; stdcall;
L2ParamStackFree_Original: procedure; stdcall;
RequestBypassToServer_Original: procedure(l2p: PL2ParamStack); stdcall;
...
//**********************************************************************************************************
procedure l2stackCreate(l2p: PL2ParamStack); stdcall;
asm
push ecx;
mov ecx, l2p;
push 0Ah;
call L2ParamStackCreate_Original;
pop ecx;
end;
procedure L2StackPushBack(l2p: PL2ParamStack; cmd: string); stdcall;
asm
mov ecx,cmd;
push ecx;
mov ecx, l2p;
call L2ParamStackPushBack_Original;
end;
procedure L2StackPushBackInt(l2p: PL2ParamStack; cmd: Integer); stdcall;
asm
mov ecx,cmd;
push ecx;
mov ecx, l2p;
call L2ParamStackPushBack_Original;
end;
procedure L2StackClear(l2p: PL2ParamStack); stdcall;
asm
mov ecx, l2p;
call L2ParamStackClear_Original;
end;
procedure L2StackFree(l2p: PL2ParamStack); stdcall;
asm
mov ecx, l2p;
call L2ParamStackFree_Original;
end;
//*****************************************************************************************
...
constructor TL2Param.create;
begin
New(l2p);
L2StackCreate(l2p);
end;
destructor TL2Param.Destroy;
begin
Dispose(l2p);
end;
procedure TL2Param.l2Clear;
begin
L2StackClear(l2p);
end;
procedure TL2Param.l2Free;
begin
L2StackFree(l2p);
end;
procedure TL2Param.l2PushBack(cmd: string);
begin
L2StackPushBack(l2p,cmd);
end;
procedure TL2Param.l2PushBackInt(i: integer);
begin
L2StackPushBackInt(l2p,i);
end;
...
procedure MainProc;
begin
//*****************************************************************************************
L2ParamStackCreate_Original:= GetProcAddress(hCoreDll,'??0L2ParamStack@@QAE@AAV0@@Z');
L2ParamStackClear_Original:= GetProcAddress(hCoreDll,'?Clear@L2ParamStack@@QAEXXZ');
L2ParamStackPushBack_Original:= GetProcAddress(hCoreDll,'?PushBack@L2ParamStack@@QAEHPA_W@Z');
L2ParamStackFree_Original:= GetProcAddress(hCoreDll,'??1L2ParamStack@@QAE@XZ');
RequestBypassToServer_Original:= GetProcAddress(hEngineDLL,'?RequestBypassToServer@UNetworkHandler@@UAEHAAVL2ParamStack@@@Z');
//******************************************************************************************
end;
...
procedure RequestBypassToServer_Call(l2p: PL2ParamStack); stdcall;
asm
push l2p;
mov ecx, nh;// nh - указатель на UNetworkHandler
call RequestBypassToServer_Original;
end;
...
procedure RequestBypassToServer_My(s: string);
var
param: TL2Param;
begin
param:= TL2Param.Create;
param.l2Clear;
param.l2PushBack(s);
RequestBypassToServer_call(param.l2p);
param.l2Free;
param.Destroy;
end;
Вроде ни чего не забыл.
L2ParamStack::Top - вроде достает значение с вершины стека. Точно не знаю, с этой функцией пока не приходилось работать
Последний раз редактировалось maxilam, 07.11.2011 в 01:21 .
Причина: хде тута кнопка Дельфи код?
За это сообщение maxilam нажился 3 спасибками от:
07.11.2011, 01:39
#6
Пользователь
Регистрация: 04.11.2009
Сообщений: 44
Сказал Спасибо: 57
Имеет 3 спасибок в 2 сообщенях
спс большое, сейчас буду разбираться.
Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?
Последний раз редактировалось vahes, 07.11.2011 в 02:07 .
07.11.2011, 14:13
#7
Пользователь
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
Цитата:
Сообщение от
vahes
Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?
Попробуй, но меня и так устраивает, нареканий нет.
Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
Часовой пояс GMT +4, время: 03:03 .
vBulletin style designed by
MSC Team .
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод:
zCarot
Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!