Однако добиться исправной работы даже порезанного 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.