⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plugin.pas

📁 传世源码可编译的,功能齐全.是学习的好模版,会DELPHI的朋友们也可以自己修改,弄个自己的引擎.
💻 PAS
字号:
unit PlugIn;

interface
uses
  Windows,Classes,SysUtils,Forms,Grobal2,SDK;
type
  TPlugInfo = record
    DllName :String;
    sDesc   :String;
    Module  :THandle;
  end;

  pTPlugInfo = ^TPlugInfo;
  TPlugInManage = class
    PlugList:TStringList;


  public
    constructor Create();
    destructor Destroy; override;
    procedure LoadPlugIn();
    procedure UnLoadPlugIn();
    procedure StartM2ServerDLL();
  end;
  procedure MainMessage(Msg:PChar;nMsgLen:Integer;nMode:Integer);stdcall;
  procedure SendBroadCastMsg(Msg:PChar;MsgType:TMsgType);stdcall;
  procedure SetRunSocketRun(RunSockRun:TClassProc);stdcall;
  function  FindProcTable(ProcName:PChar;nNameLen:Integer):Pointer;stdcall;
  function  SetProcTable(ProcAddr:Pointer;ProcName:PChar;nNameLen:Integer):Boolean;stdcall
  function  FindOBjTable(ObjName:PChar;nNameLen:Integer):TObject;stdcall;

implementation

uses M2Share, EDcode;
Const
  StrProc5= 'PrQpORAtQSIaX`IkYRup';
  StrProc6= 'PrQpPbQiWsMaR@yNNrQu';
  //GetVersion
  StrFun1= 'MrQpQbQnXrakW\';
  //GetXORKey
  StrFun2= 'MrQpR@yNNrQu';
var
  nM2ServerVersion:Integer = -1;
  nStartPlug:Integer = -1;
  PN_SENDBROADCASTMSG:string;
procedure MainMessage(Msg:PChar;nMsgLen:Integer;nMode:Integer);
var
  MsgBuff  :String;
begin
  if (Msg <> nil) and (nMsgLen > 0) then begin
    SetLength(MsgBuff,nMsgLen);
    Move(Msg^,MsgBuff[1],nMsgLen);
    case nMode of
      0: begin
        if Memo <> nil then
          Memo.Lines.Add(MsgBuff);
      end;
      else MainOutMessage(MsgBuff);
    end;
  end;
end;
procedure SendBroadCastMsg(Msg:PChar;MsgType:TMsgType);stdcall;
begin
  if UserEngine <> nil then
    UserEngine.SendBroadCastMsgExt(Msg,MsgType);
end;
procedure SetRunSocketRun(RunSockRun:TClassProc);stdcall;
begin

end;

//=================================
//由DLL调用按名字查找函数地址
function  FindProcTable(ProcName:PChar;nNameLen:Integer):Pointer;
var
  I: Integer;
  sProcName:String;
begin
  Result:=nil;
  SetLength(sProcName,nNameLen);
  Move(ProcName^,sProcName[1],nNameLen);
  for I := Low(ProcArray) to High(ProcArray) do begin
    if (ProcArray[I].nProcAddr <> nil) and (CompareText(sProcName,ProcArray[I].sProcName) = 0) then begin
      Result:=ProcArray[I].nProcAddr;
      break;
    end;
  end;
end;
//=================================
//由DLL调用按名字设置插件中的函数地址
function  SetProcTable(ProcAddr:Pointer;ProcName:PChar;nNameLen:Integer):Boolean;
var
  I: Integer;
  sProcName:String;
begin
  Result:=False;
  SetLength(sProcName,nNameLen);
  Move(ProcName^,sProcName[1],nNameLen);
  for I := Low(PlugProcArray) to High(PlugProcArray) do begin
    if (PlugProcArray[I].nProcAddr = nil) and (CompareText(sProcName,PlugProcArray[I].sProcName) = 0) then begin
      PlugProcArray[I].nProcAddr:=ProcAddr;
      Result:=True;
      break;
    end;
  end;
end;
//=================================
//由DLL调用按名字查找全局对象地址
function FindOBjTable(ObjName:PChar;nNameLen:Integer):TObject;
var
  I: Integer;
  sObjName:String;
begin
  Result:=nil;
  SetLength(sObjName,nNameLen);
  Move(ObjName^,sObjName[1],nNameLen);
  for I := Low(ProcArray) to High(ProcArray) do begin
    if (OBjectArray[I].Obj <> nil) and (CompareText(sObjName,OBjectArray[I].sObjcName) = 0) then begin
      Result:=OBjectArray[I].Obj;
      break;
    end;
  end;
end;
{ TPlugIn }

constructor TPlugInManage.Create;
begin
  PlugList:=TStringList.Create;
//  FillChar(ProcArray,SizeOf(ProcArray),0);
end;

destructor TPlugInManage.Destroy;
var I:integer;
begin
  if PlugList.Count > 0 then UnLoadPlugIn();
  for I:=0 to PlugList.count-1 do begin
   dispose( pTPlugInfo(PlugList.Objects[i]) );
  end;
  PlugList.Free;
  inherited;
end;

procedure TPlugInManage.LoadPlugIn;
var
  I: Integer;
  LoadList:TStringList;
  sPlugFileName:String;
  sPlugLibName:String;
  sPlugLibFileName:String;
  Moudle: THandle;
  PFunc: TPlugInit;
  PlugInfo:pTPlugInfo;
begin
{$IF SoftVersion = VERDEMO}
  InitPlugArrayTable();
{$IFEND}

  sPlugFileName:=g_Config.sPlugDir + 'PlugList.txt';
//  if FileExists(sPlugFileName) then begin
  if not FileExists(sPlugFileName) then begin
    LoadList:=TStringList.Create;
    LoadList.Add('M2Server.dll');
    LoadList.SaveToFile(sPlugFileName);
    LoadList.Free;
  end;
    LoadList:=TStringList.Create;
    LoadList.LoadFromFile(sPlugFileName);
    for I := 0 to LoadList.Count - 1 do begin
      sPlugLibName:=Trim(LoadList.Strings[I]);
      if (sPlugLibName = '') or (sPlugLibName[1] = ';') then Continue;
      sPlugLibFileName:=g_Config.sPlugDir + sPlugLibName;
      if FileExists(sPlugLibFileName) then begin
        Moudle:=Loadlibrary(PChar(sPlugLibFileName)); //FreeLibrary
        if Moudle > 32 then begin
          PFunc:=GetProcAddress(Moudle,'Init');
          if @PFunc <> nil then begin
            New(PlugInfo);
            PlugInfo.DllName:=sPlugLibFileName;
            PlugInfo.sDesc:=PFunc(Application.Handle,MainMessage,FindProcTable,SetProcTable,FindOBjTable);
            PlugList.AddObject(PlugInfo.sDesc,TObject(PlugInfo));
          end;
        end;
      end;
    end;
    LoadList.Free;
end;

procedure TPlugInManage.StartM2ServerDLL;
type
  TGetVersion = function():Single;stdcall;
  TStartPlug  = procedure(Config:pTConfig);
begin
  if (nM2ServerVersion >= 0) and Assigned(PlugProcArray[nM2ServerVersion].nProcAddr) then begin
{$IF SoftVersion = VERENT}
    if TGetVersion(PlugProcArray[nM2ServerVersion].nProcAddr) = 98 then begin
{$ELSE}
    if TGetVersion(PlugProcArray[nM2ServerVersion].nProcAddr) = 5 then begin
{$IFEND}
      if (nStartPlug >= 0) and Assigned(PlugProcArray[nStartPlug].nProcAddr) then begin
        TStartPlug(PlugProcArray[nStartPlug].nProcAddr)(@g_Config);
      end;
    end;
  end;
end;

procedure TPlugInManage.UnLoadPlugIn;
var
  I: Integer;
  Module:THandle;
  PFunc:procedure();
begin
  for I := 0 to PlugList.Count - 1 do begin
    Module:=THandle(PlugList.Objects[I]);
    PFunc:=GetProcAddress(Module,'UnInit');
    if @PFunc <> nil then 
      PFunc();
    FreeLibrary(Module);
  end;
end;

//设远程XORKey
procedure SetRemoteXORKey(nRemoteXORKey:Integer; XORStr:PChar);stdcall;
begin
  RemoteXORKey := nRemoteXORKey;
end;

function GetVersion():Single;stdcall;
begin
  Result := M2ServerVersion;
end;

function GetXORKey():Integer;stdcall;
begin
  LocalXORKey :=  GetTickCount;
  Result := LocalXORKey;
end;

procedure SetMaxUserCount(nUserCount:Integer);stdcall;
begin

end;

initialization
begin
  AddToProcTable(@SendBroadCastMsg,PN_SENDBROADCASTMSG);
  nM2ServerVersion:=AddToPulgProcTable(DecodeStringmir('OOEOUSErUSERUSEoVRyj'){'M2ServerVersion'});
  nStartPlug:=AddToPulgProcTable(DecodeStringmir('PsM]XcMLWCQc'){'StartPlug'});
  AddToProcTable(@SetMaxUserCount,DecodeStringmir(StrProc5));
  AddToProcTable(@SetRemoteXORKey,DecodeStringmir(StrProc6));
  AddToProcTable(@GetVersion,DecodeStringmir(StrFun1));
  AddToProcTable(@GetXORKey,DecodeStringmir(StrFun2));
end;

finalization
begin

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -