• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 225
  • Last Modified:

Send message to another computer API calls

How can i send message to another computer to remind the person about something? Is this API Calls ( Do you have some code ) Thanks!!
0
emiltor
Asked:
emiltor
  • 5
  • 4
  • 3
  • +2
1 Solution
 
williams2Commented:
Nope! It is either DCOM, UDP, IPX, TCPIP etc.

If you are to setup a server through a Local Area Network, you should use either DCOM (Distributed COM) or UDP (User Datagram Protocol)

Another and more secure way, is to make the client do a TCP/IP connection to the server at startup. Afterwards, it's very easy to control events and dataparsing. I can give you bright examples of this.

Which version of Delphi have you got?

regards,
Williams
0
 
rwilson032697Commented:
Odd - I always thought the U in UDP was for Unreliable in that the protocol does not in fact gurantee delivery of the packet. (at least it is in the Unix world...)

Cheers,

Raymond.
0
 
BlackManCommented:
There is the good ol' WinPopup, which uses Mailslots. There is a Delphi implementation of WinPopup, including source, at http://djernaes.dk/martin/winpopup.html
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
williams2Commented:
Hi Raymond!

So did I, until I got corrected by Andrew S. Tannenbaum in his book "Computer Networks"

BlackMan is right, I guess. This must be the easiest way to do this.

Cheers,
Williams
0
 
emiltorAuthor Commented:
I have Delphi 3.0.1 Client/Server
0
 
erajojCommented:
You can also use NetMessageBufferSend, this is really easy, but works only in NT.

/// John
0
 
emiltorAuthor Commented:
Excelent !! I only use NT , Do you have any code or something ?
0
 
williams2Commented:
I guess this might work. You have to declare the function first!

Like this:

interface


  ...

  Function NetMessageBufferSend (
     pServername,
     pMsgName,
     pFromname: PWideChar;
     buf: pChar;
     buflen: DWORD): UINT; stdcall;
  external 'netapi32.dll' name 'NetMessageBufferSend';

implementation

{$R *.DFM}

procedure DoSendMessage(ServerName,Headline,From: String; Message: TStringList);
var
  i,count: Integer;
begin
  count:= 0;
  For i:= 0 to message.Count-1 do Inc(Count,length(message.strings[i])+1);
  If From='' then From:= #0; //uses the default loginName
  NetMessageBufferSend(PWideChar(ServerName),
                       PWideChar(Headline),
                       PWideChar(From),
                       Message.GetText,
                       count);
End;

..


end.


Does that work? ..I'm sorry, that I cannot test it myself, I haven't got two computers, but the app seemed to be busy doing something hehe. :-)

Cheers,
Williams
0
 
erajojCommented:
Do you need further help, or is Williams comment enough?
The drawback with this method is: you can't handle the message yourself on the receiver end, unless you substitute the messenger service.

/// John

0
 
emiltorAuthor Commented:
I'm glad if you have any code John....

Williams have to explane his answer better - i don't understand it enought

thanks..... williams & John

(/Ho is better)
0
 
BlackManCommented:
If you go for Williams / johns answer, I think you should reject my answer...
0
 
emiltorAuthor Commented:
Sorry Blackman, when i go to the page you send me it doesn't work and now when i test again it works. and there is lots of stuff about my question ( "allright" )

Thanks...

0
 
erajojCommented:
Hi again,
Here's a simple unit with the functions supplied by Williams and some sample code:

unit NetMsg;

{ Example unit for sending messages over the network }
{ For users at experts-exchange, use freely at own risk }
{ created 1998-12-10 by John Johansson (erajoj) }

interface

uses Windows, Classes;

function NetMessageBufferSend(
   pServername,
   pMsgName,
   pFromname,
   pBuf: PWideChar;
   dwBufLen: DWORD): UINT; stdcall;
   external 'netapi32.dll' name 'NetMessageBufferSend';

{ Send strings to single recipient at optional server and with optional signature }
function DoSendMessage( pServerName, pFrom, pReceiver: PWideChar; rgsMsg: TStrings ): Boolean;
{ Send strings to multiple recipients at optional server and with optional signature }
function DoSendMessageEx( pServerName, pFrom: PWideChar; rgsReceiver, rgsMsg: TStrings ): Boolean;
{ Lightweight send strings to single recipient }
function SendMsg( sReceiver, sMessage: string ): Boolean;

implementation

function DoSendMessage( pServerName, pFrom, pReceiver: PWideChar; rgsMsg: TStrings ): Boolean;
var
  sMsg: WideString;
begin
  sMsg := rgsMsg.Text; { autoconvert from ansi to wide string }
  Result := NetMessageBufferSend(
    pServerName,
    pReceiver,
    pFrom,
    PWideChar( sMsg ),
    SizeOf( WideChar ) * ( Length( sMsg ) + 1 ) { 2 byte per char + zero terminator }
  ) = 0;
end;

function DoSendMessageEx( pServerName, pFrom: PWideChar; rgsReceiver, rgsMsg: TStrings ): Boolean;
var
  sMsg: WideString;
  iIndex: Integer;
begin
  Result := True;
  for iIndex := 0 to rgsReceiver.Count - 1 do
  begin
    sMsg   := rgsReceiver[ iIndex ]; { autoconvert from ansi to wide string }
    Result := Result and DoSendMessage( pServerName, pFrom, PWideChar( sMsg ), rgsMsg );
  end;
end;

function SendMsg( sReceiver, sMessage: string ): Boolean;
var
  sRec, sMsg: WideString;
begin
  sRec := sReceiver; { autoconvert from ansi to wide string }
  sMsg := sMessage;  { autoconvert from ansi to wide string }
  Result := NetMessageBufferSend(
    nil,
    PWideChar( sRec ),
    nil,
    PWideChar( sMsg ),
    SizeOf( WideChar ) * ( Length( sMsg ) + 1 ) { 2 byte per char + zero terminator }
  ) = 0;
end;

Samples:

uses ..., netmsg;
  ...

procedure TMainForm.Button1Click(Sender: TObject);
begin
  SendMsg( 'john', 'Hello! Let''s go out to lunch!' );
end;

procedure TMainForm.Button2Click(Sender: TObject);
begin
  DoSendMessageEx( '\\DEVSRV', nil, ColleagueListBox.Items, MessageListBox.Items );
end;

procedure TMainForm.Button3Click(Sender: TObject);
begin
  DoSendMessage( nil, nil, 'myonlyfriend', InfoStringList );
end;

procedure TMainForm.Button4Click(Sender: TObject);
begin
  if not SendMsg( 'emiltor', 'Enough?' ) then
    ShowMessage( 'Not good enough. Didn''t get through!' );
end;

end.

Can't really do any better than this right now...
Points go to Williams if this solution is sufficient.

/// John
0
 
emiltorAuthor Commented:
Thanks
Blackman,Williams,John,Raymond

Now i can send message

Keep the smile high..............
0
 
williams2Commented:
You're welcome

Thanx to John for his corrections :-)

Regards,
Williams
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 5
  • 4
  • 3
  • +2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now