Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Разработка
Войти через OpenID

Разработка Раздел для совместной разработки/доработки программы

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 06.10.2008, 09:45   #1
Местный
 
Аватар для wanick
 
Регистрация: 20.09.2008
Сообщений: 133
Сказал Спасибо: 32
Имеет 54 спасибок в 22 сообщенях
wanick пока неопределено
По умолчанию

Я так понимаю, палгины в нашем случае это тотже скрипт только уже ввиде скомпиленного dll,
это кулл, тоесть скрипты теперь не будут юзатся для изобретения сложных скриптов ну например как рыбалка это просто замечательно...

скрипты нужны щас для быстрых тестов
wanick вне форума   Ответить с цитированием
Старый 06.10.2008, 15:18   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

воть, но структуры и функции на С++ сам переписывай.., мне пока не до этого...
Вложения
Тип файла: rar l2phx3.4.0_and_plugin_source.rar (892.7 Кб, 85 просмотров)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 06.10.2008, 21:07   #3
Пользователь
 
Регистрация: 28.06.2008
Сообщений: 33
Сказал Спасибо: 12
Имеет 15 спасибок в 8 сообщенях
RoZ пока неопределено
По умолчанию

Цитата:
Сообщение от xkor Посмотреть сообщение
воть, но структуры и функции на С++ сам переписывай.., мне пока не до этого...
Как я уже говорил в Дельфи не силён...посему не пинайте сильно если что не так.
Код:
function TPlugin.LoadInfo: Boolean;
begin
  ...
  Info:=String(GetPluginInfo(version));
  >>> GetPluginInfo возвращает указатель на строку
        и присваивает его нашей глобальной переменной Info.
  ...
  FreeLibrary(hLib);
  >>> уничтожаем библиотеку и заодно наш указатель на строку (на самом деле он продолжает висеть в памяти, так как DLL сделанная в Дельфи не освобождает переменные String пока счётчик использований не достигнет 0) 

  Result:=True;
end;
предлагаю внести небольшое изменение в функции TPlugin.LoadInfo и TPlugin.LoadPlugin
Код:
function TPlugin.LoadInfo: Boolean;
var
  tempString:PChar;
begin
...
tempString:=(GetPluginInfo(version));
Info:=tempString;
...
end;
Код:
function TPlugin.LoadPlugin: Boolean;
var
  tempString:PChar;
begin
...
tempString:=(GetPluginInfo(version));
Info:=tempString;
...
end;
RoZ вне форума   Ответить с цитированием
Старый 06.10.2008, 21:32   #4
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

RoZ, ты не прав, Info:=String(GetPluginInfo(version)) - копирует строку находящуюся по указателю возвращаемому GetPluginInfo в переменную Info так как типы PChar и String в одном месте памяти плохо ужываются ибо разные они....
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 06.10.2008, 22:02   #5
Пользователь
 
Регистрация: 28.06.2008
Сообщений: 33
Сказал Спасибо: 12
Имеет 15 спасибок в 8 сообщенях
RoZ пока неопределено
По умолчанию

Цитата:
Сообщение от xkor Посмотреть сообщение
RoZ, ты не прав, Info:=String(GetPluginInfo(version)) - копирует строку находящуюся по указателю возвращаемому GetPluginInfo в переменную Info так как типы PChar и String в одном месте памяти плохо ужываются ибо разные они....
Да, ты приводишь PChar к String, уже потом их приравниваешь, но строки в Дельфи очень хитрые люди делали, и они решили сэкономить на памяти и поэтому при присваивании String:=String копируется адрес, так сказать оптимизация во всей красе...
http://www.sources.ru/magazine/0804/delphistr.html - вот тут очень подробно расписаны особенности строк в Дельфи.
З.Ы. Почему собственно я это заметил, дело в том что если DLL написана на С++, то при уничтожении библиотеки, по адресу перменной Info пустота...
З.Ы.Ы. Прошу сильно не пинать и показать где я ошибся.
RoZ вне форума   Ответить с цитированием
Старый 06.10.2008, 22:21   #6
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

RoZ, дело в том что если преобразовывать String в PChar то получается просто указатель на первый символ строки, а вот если наоборот PChar в String, то надо перед первым символом ещё разместить счётчик ссылок и длинну строки, поэтому строка при этом копируется и получается что если есть переменная p типа PChar, то PChar(String(p))<>p
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 06.10.2008, 16:41   #7
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

кстати демонстрационный плагин просто отсылает пакет Say2 клиенту 2 раза при приходе такого пакета от сервера
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 07.10.2008, 01:01   #8
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

ревизия 39:
обновил возможности плагинов, теперь из плагина есть доступ к следующим встроенным в пакетхак фукнциям:
procedure SendPacket(Size: Word; pck: string; tid: Byte; ToServer: Boolean);
procedure SendPckStr(pck: string; const tid: Byte; const ToServer: Boolean);
procedure SendPckData(var pck; const tid: Byte; const ToServer: Boolean); stdcall;
function DataPckToStrPck(var pck): string; stdcall;

function ReadC(const pck: string; const index:integer):byte; stdcall;
function ReadH(const pck: string; const index:integer):word; stdcall;
function ReadD(const pck: string; const index:integer):integer; stdcall;
function ReadF(const pck: string; const index:integer):double; stdcall;
function ReadS(const pck: string; const index:integer):string; stdcall;
function ReadCEx(const pck; const index:integer):byte; stdcall;
function ReadHEx(const pck; const index:integer):word; stdcall;
function ReadDEx(const pck; const index:integer):integer; stdcall;
function ReadFEx(const pck; const index:integer):double; stdcall;
function ReadSEx(const pck; const index:integer):string; stdcall;
procedure WriteC(var pck: string; const v:byte; ind:integer=-1); stdcall;
procedure WriteH(var pck: string; const v:word; ind:integer=-1); stdcall;
procedure WriteD(var pck: string; const v:integer; ind:integer=-1); stdcall;
procedure WriteF(var pck: string; const v:double; ind:integer=-1); stdcall;
procedure WriteS(var pck: string; const v:string; ind:integer=-1); stdcall;
procedure WriteCEx(var pck; const v:byte; ind:integer=-1); stdcall;
procedure WriteHEx(var pck; const v:word; ind:integer=-1); stdcall;
procedure WriteDEx(var pck; const v:integer; ind:integer=-1); stdcall;
procedure WriteFEx(var pck; const v:double; ind:integer=-1); stdcall;
procedure WriteSEx(var pck; const v:string; ind:integer=-1); stdcall;

function HexToString(Hex:String):String;
function StringToHex(str1,Separator:String):String;

а так же в качестве демо-плагина теперь простенький автоюзатель НР бутылок

Добавлено через 42 минуты
RoZ, почитал я ту статью, действительно проблемы возникнуть могут, но не из за того что ты описал а если память освободиться между присвоением значения строке в длл и копированием строки в программе, а это на мой взгляд произойти практически не может...

вот не большое исследование в дебагере
выполняется в программе:
Код:
phxPlugins.pas.143: Info:=String(GetPluginInfo(version));
004928EF 6801000403       push $03040001               ;кладём в стек параметр version
004928F4 FF5618           call dword ptr [esi+$18]     ;вызываем GetPluginInfo
прыгаем в плагин:
Код:
plugin_demo.dpr.23: Result:='Демонстрационный Plugin к программе l2phx'+sLineBreak+
0141459F B830464101       mov eax,$01414630            ;записываем в результат ссылку на текст
plugin_demo.dpr.26: end;
014145A4 5D               pop ebp                      ;неважно
014145A5 C20400           ret $0004                    ;возврат в программу
возвращаемся в программу:
Код:
004928F7 8BD0             mov edx,eax                  ;переносим результат GetPluginInfo в другой регистр
004928F9 8D4608           lea eax,[esi+$08]            ;записываем в регистр eax адрес Info
004928FC E86B29F7FF       call @LStrFromPChar          ;преобразуем PChar из edx в String помещая его в Info
__________________
Я здесь практически не появляюсь!, Skype - ikskor

Последний раз редактировалось xkor, 07.10.2008 в 01:01. Причина: Добавлено сообщение
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился 3 спасибками от:
Старый 07.10.2008, 19:05   #9
Пользователь
 
Аватар для Emocean
 
Регистрация: 04.02.2008
Сообщений: 63
Сказал Спасибо: 44
Имеет 25 спасибок в 15 сообщенях
Emocean
По умолчанию

А я надеялсо, что скрипты переписывать не придётсо
Emocean вне форума   Ответить с цитированием
Старый 07.10.2008, 20:20   #10
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Emocean, а нах их переписывать?
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Разработка



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

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


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

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

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