Показать сообщение отдельно
Старый 25.07.2009, 04:04   #39
Новичок
 
Регистрация: 24.07.2009
Сообщений: 4
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
Kennedy пока неопределено
По умолчанию

Однако добиться исправной работы даже порезанного demo плагина у меня не получилось.Вот то что я сделал в итоге с исходником после нескольких часов его мучения:
delphi Код:
library plugin_demo; uses   FastMM4 in '..\fastmm\FastMM4.pas',   FastMM4Messages in '..\fastmm\FastMM4Messages.pas',   SysUtils,   Windows,   dialogs,   Classes,   usharedstructs in '..\units\usharedstructs.pas'; var                                {version} {revision}   min_ver_a: array[0..3] of Byte = ( 3,5,12,      120   );   min_ver: Integer absolute min_ver_a;   ps: TPluginStruct;   pps: PPluginStruct;   ppck: PPacket; const   pause=15000; var   ColvoHP, CharObjID, ItemObjHP: integer;   CurHP, MaxHP, lastHP, cntHP:integer;   TimerHP: Boolean;   StatusHP: Boolean; function GetPluginInfo(const ver: Integer): PChar; stdcall; begin   if ver<min_ver then     Result:='плаг'+sLineBreak+             'Для версий 3.5.12.120+'+sLineBreak+             'стар'   else     Result:='плаг'+sLineBreak+             'Для версий 3.5.12.120+'+sLineBreak+             'Автовыпивалка НР бутылок'; end; procedure Say(msg:string); stdcall; var   buf:String; begin   ps.WriteC(buf,$4A);   ps.WriteD(buf,0);   ps.WriteD(buf,2);   ps.WriteS(buf,'AutoHP');   ps.WriteS(buf,msg + ps.getConnectionName(cntHP));   ps.WriteH(buf,0);   ps.SendPacketStr(buf,cntHP,False); end; function SetStruct(const struct: PPluginStruct): Boolean; stdcall; begin   ps := TPluginStruct(struct^);   pps := struct;   Result:=True; end; procedure StatsUpdate; var  i: integer; begin  for i:=0 to ps.ReadDEx(ppck^,7)-1 do  case ppck^.data[i*8+8] of    $09: CurHP:=ps.ReadDEx(ppck^,i*8+15);    $0A: MaxHP:=ps.ReadDEx(ppck^,i*8+15);  end;  say('CurHP/MaxHP = '+inttostr(curhp)+'/'+inttostr(maxhp));  if (CurHP<=MaxHP-50) then TimerHP:=true else TimerHP:=false; end; procedure OnLoad; stdcall; begin   statusHP:=false;   CharObjID:=0;   ItemObjHP:=0;   TimerHP:=false;   lastHP:=0;   cntHP := -1; end; procedure OnPacket(const cnt: Cardinal; const fromServer: Boolean; const connectionname:string; var pck: Tpacket); stdcall; begin   if pck.size<3 then exit;   ppck:=@pck;   if not FromServer and(pck.pckId=$49)and(cntHP=-1)then   if(ps.ReadSEx(pck,3)='set')then begin     pck.pckSize:=0;     cntHP:=cnt;     Say('Выбрано это соединение.');     Say('Для...');   end; end; exports   GetPluginInfo,   OnPacket,   OnLoad,   SetStruct; begin end.

Плагин загружаю когда чара уже выбрали, дальше пишу set и в чат клиента пишется всего одна строчка "Выбрано это соединение" вместе с месседжем:
Application error. Exception EInvalidPointer in module plugin_demo.dll at xxx
Т.е. раз сообщение дошло то строчка в процедуре Say ps.SendPacketStr(buf,cntHP,False);
выполняется. И исключение срабатывает на выходе из этой процедуры.

Использую CodeGear Delphi 2007. Оригинальный плагин plugin_demo.pas из SVN.
Kennedy вне форума   Ответить с цитированием