Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 09.06.2011, 02:41   #1
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
maxilam пока неопределено
По умолчанию Функция RequestBypassToServer

Доброе время суток. Уважаемы гуру, прошу помощи у вас, ибо сам уже зашел в тупик.
Как, используя функцию RequestBypassToServer из engine.dll, отправить некоторый пункт ответа в диалоге с НПС?
Или, если быть точнее, как работать с классом L2ParamStack?
Хроники Грация Финал.
Буду очень признателен за любую помощь, а то уже несколько дней бьюсь как рыба об лед.
maxilam вне форума   Ответить с цитированием
Старый 09.06.2011, 10:37   #2
Пользователь
 
Регистрация: 19.07.2010
Сообщений: 45
Сказал Спасибо: 10
Имеет 23 спасибок в 12 сообщенях
Guzh пока неопределено
По умолчанию

Цитата:
Сообщение от 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 вне форума   Ответить с цитированием
За это сообщение Guzh нажился 6 спасибками от:
Старый 11.06.2011, 10:09   #3
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
maxilam пока неопределено
По умолчанию

Код:
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

Последний раз редактировалось maxilam, 11.06.2011 в 14:00.
maxilam вне форума   Ответить с цитированием
За это сообщение maxilam нажился 2 спасибками от:
Старый 06.11.2011, 23:29   #4
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 44
Сказал Спасибо: 57
Имеет 3 спасибок в 2 сообщенях
vahes пока неопределено
По умолчанию

Цитата:
Сообщение от maxilam Посмотреть сообщение
строка
Код:
mov     ecx, UnKnown
Должна быть вида
Код:
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)?
vahes вне форума   Ответить с цитированием
Старый 07.11.2011, 00:57   #5
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
maxilam пока неопределено
По умолчанию

В кратце пример работы (вроде лишнего ни чего не повырезал )) ):

Код:
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 вне форума   Ответить с цитированием
За это сообщение maxilam нажился 3 спасибками от:
Старый 07.11.2011, 01:39   #6
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 44
Сказал Спасибо: 57
Имеет 3 спасибок в 2 сообщенях
vahes пока неопределено
По умолчанию

спс большое, сейчас буду разбираться.

Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?

Последний раз редактировалось vahes, 07.11.2011 в 02:07.
vahes вне форума   Ответить с цитированием
Старый 07.11.2011, 14:13   #7
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 46
Сказал Спасибо: 6
Имеет 19 спасибок в 12 сообщенях
maxilam пока неопределено
По умолчанию

Цитата:
Сообщение от vahes Посмотреть сообщение
Вот я смотрю, для каждого вызова процедуры класс создается и уничтожается, а не будет быстрее и для экономии системных ресурсов раз создать экземпляр класса, а перед вызовом процедуры которая его использует просто очищать и засовывать параметры по новой, а уничтожать по завершению программы?
Попробуй, но меня и так устраивает, нареканий нет.
maxilam вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 23:17.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!