unit uBase.MsgManage; interface uses classes, windows, Messages, IdUDPServer, IdUDPClient, IdSocketHandle, uBase.MessageType; const Msg_UpLine = WM_USER + 101; Msg_DownLine = WM_USER + 102; Msg_ClaimFile = WM_USER + 103; Msg_ReceiveFile = WM_USER + 104; Msg_ExecMessage = WM_USER + 105; type TMsgManage = class(TComponent) private FLocalIP: string; FLocalRecPort: Integer; FRecIP: string; FRecPort: Integer; FWndHandle: THandle; FMsgUDPServer: TIdUDPServer; FMsgUDPClient: TIdUDPClient; procedure SendMsg(vHost: string; vPort: Integer; vMsg: TBaseMessage); protected procedure WndProc(var Msg: TMessage); procedure UPLine(vCm: TCommandMsg); virtual; abstract; procedure DownLine(vCm: TcommandMsg); virtual; abstract; procedure ClaimFile(vCm: TCommandMsg); virtual; abstract; procedure ReceiveFile(vCm: TCommandMsg); virtual; abstract; procedure ExecMsg(vBm: TBaseMessage); virtual; abstract; procedure MessageUDPServerUDPRead(Sender: TObject; AData: TStream; ABiding: TIdSocketHandle); public constructor create(AOWner: TComponent); override; end; implementation { TMsgManage } constructor TMsgManage.create(AOWner: TComponent); begin inherited; FWndHandle := AllocateHWnd(WndProc); end; procedure TMsgManage.MessageUDPServerUDPRead(Sender: TObject; AData: TStream; ABiding: TIdSocketHandle); var MsgObj: TBaseMessage; Str: string; begin AData.Position := 0; MsgObj := TBaseMessage.Create(nil); AData.ReadComponent(MsgObj); //ABiding.SendTo(ABiding.PeerIP, ABiding.PeerPort, Str[1], Length(Str)); Windows.SendMessage(FWndHandle, Msg_ExecMessage, Integer(MsgObj), 0) end; procedure TMsgManage.SendMsg(vHost: string; vPort: Integer; vMsg: TBaseMessage); var MS: TMemoryStream; SendBuf: BufferArray; begin vMsg.SendIP := FLocalIP; vMsg.SendPort := FLocalRecPort; vMsg.RecIP := FRecIP; vMsg.RecPort := FRecPort; try MS := TMemoryStream.Create; MS.WriteComponent(vMsg); MS.Position := 0; ZeroMemory(@SendBuf, PackLen); MS.Read(SendBuf, MS.Size); FMsgUDPClient.SendBuffer(vHost, vPort, SendBuf, MS.Size); finally MS.Free; end; end; procedure TMsgManage.WndProc(var Msg: TMessage); begin with Msg do begin case Msg of Msg_UpLine: UpLine(TCommandMsg(WParam)); Msg_DownLine: DownLine(TCommandMsg(WParam)); Msg_ClaimFile: ClaimFile(TCommandMsg(WParam)); Msg_ReceiveFile: ReceiveFile(TCommandMsg(WParam)); Msg_ExecMessage: ExecMsg(TBaseMessage(WParam)); else Result := DefWindowProc(FWndHandle, Msg, WParam, LParam); end // end case end; // end with // end; end.