Rede - enviando mensagens winapi

Top  Previous  Next

// Enviando mensagens para terminais Win2000 usando a NETAPI

// Basta usar como abaixo um objeto criado logo a seguir

 

uses netsend;

 

var NS : TNetSend;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  NS.SendMessage('M02','vou pular pela janela');

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  NS := TNetSend.Create;

end;

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  NS.Free;

end;

 

// ----------------------------------------------------------------------

 

unit NetSend;

 

interface

 

uses Windows, Classes;

 

type

   // DLL Prototype declaration

   TFSendMessage = function(ServerName, MsgName, FromName: PWideChar; Buf: Pointer; BufLen: Integer): Integer; stdcall;

 

   // TNetSend Class

   TNetSend = class(TObject)

   private

     fLibHandle  : THandle;

     fSendMessage: TFSendMessage;

   public

     constructor Create;

     destructor Destroy; override;

     function SendMessage(const ToName, NetMessage: string; ServerName: string = ''): Boolean;

   end;

 

// -----------------------------------------------------------------------------

implementation

 

// ================================================

// Supplementarty functions

// ================================================

 

function GetLogonName : string;

var

  Buffer : string;

  Retvar : string;

  ASize  : dword;

begin

  RetVar := '';

  SetLength(Buffer,50);

  Asize := Length(Buffer);

  if GetUserName(PChar(Buffer),ASize) then

    Retvar := string(PChar(Buffer))

  else

    Retvar := '';

  Result := RetVar;

end;

 

function ComputerName: string;

var

  Name  : PChar;

  WName : string;

  Size  : DWORD;

begin

  Size := MAX_COMPUTERNAME_LENGTH + 1;

  GetMem(Name,Size);

  GetComputerName(Name,Size);

  WName := string(Name);

  FreeMem(Name);

  Result := WName;

end;

 

// ================================================

// Dynamically attempt to load library

// ================================================

 

constructor TNetSend.Create;

begin

  FLibHandle := LoadLibrary('NETAPI32.DLL');

  if FLibHandle <> 0 then

     @FSendMessage := GetProcAddress(FLibHandle,'NetMessageBufferSend');

end;

 

destructor TNetSend.Destroy;

begin

  inherited Destroy;

  if FLibHandle <> 0 then FreeLibrary(FLibHandle);

end;

 

// =============================================================

// Send a message to a user/application name

// ServerName is '' by default and equates to LOCAL COMPUTER

// Admin privilige is required to send from a remote server

// ==============================================================

 

function TNetSend.SendMessage(const ToName, NetMessage: string; ServerName: string = ''): Boolean;

var MsgBuff            : PWideChar;

    Size,NewSize       : Integer;

    User, MyName, SName: array [0..127of WideChar;

    RetVar             : Boolean;

begin

  RetVar := False;

  if @FSendMessage <> nil then

  begin

    Size := length(NetMessage);

    StringToWideChar(ServerName,SName,SizeOf(SName) div 2);

    StringToWideChar(ToName,User,SizeOf(User) div 2);

    StringToWideChar(GetLogonName+'@'+ComputerName,MyName,SizeOf(MyName) div 2);

    NewSize := Size * 2;

    MsgBuff := VirtualAlloc(nil,Size,MEM_COMMIT,PAGE_READWRITE);

    MultiByteToWideChar(CP_ACP,0,PChar(NetMessage),Size, MsgBuff,NewSize);

    RetVar := (FSendMessage(SName,User,MyName,MsgBuff, lStrLenW(MsgBuff) * SizeOf(PWideChar)) = 0);

    VirtualFree(MsgBuff,0,MEM_RELEASE);

  end;

  Result := RetVar;

end;

 

end.