Просмотр полной версии : Функция RequestBypassToServer
Доброе время суток. Уважаемы гуру, прошу помощи у вас, ибо сам уже зашел в тупик.
Как, используя функцию RequestBypassToServer из engine.dll, отправить некоторый пункт ответа в диалоге с НПС?
Или, если быть точнее, как работать с классом L2ParamStack?
Хроники Грация Финал.
Буду очень признателен за любую помощь, а то уже несколько дней бьюсь как рыба об лед.
...
Или, если быть точнее, как работать с классом L2ParamStack?
...
Я обычно работаю так:
Адреса процедур:
AdrL2StackCreate:=adrProc('core.dll','??0L2ParamSt ack@@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;
procedure l2stackCreate; //создать стек параметров
asm
push ecx
mov ecx, UnKnown
push 0Ah
call AdrL2StackCreate
pop ecx
end;
Поток завершается без ошибк при вызове AdrL2StackCreate;
Что должно находиться в ecx?
Разобрался.
строка
mov ecx, UnKnown
Должна быть вида
mov ecx, L2ParamStack
где L2ParamStack указатель на array[0..16] of byte
строка
mov ecx, UnKnown
Должна быть вида
mov ecx, L2ParamStack
где L2ParamStack указатель на array[0..16] of byte
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)?
В кратце пример работы (вроде лишнего ни чего не повырезал )) ):
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@@QAEX XZ');
L2ParamStackPushBack_Original:= GetProcAddress(hCoreDll,'?PushBack@L2ParamStack@@Q AEHPA_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 - вроде достает значение с вершины стека. Точно не знаю, с этой функцией пока не приходилось работать
спс большое, сейчас буду разбираться.
Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?
Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?
Попробуй, но меня и так устраивает, нареканий нет.
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot