一个网络信息的问题,请大家看看,能帮就帮一把吧

hbzhengyi 2003-02-12 11:19:01
如何实现在局域网中实现一台机器想另一台机器发送信息时,该机器弹出一个对话框,就想winpop?
...全文
154 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangning 2003-02-12
  • 打赏
  • 举报
回复
广播?
用net send * fsdfsdf
可以实现
我得代码不能实现广播。用循环怎么样?
kuangning 2003-02-12
  • 打赏
  • 举报
回复
我试了
可以的
kuangning 2003-02-12
  • 打赏
  • 举报
回复
怎么不行?
编译通过了嘛?
send('192.168.0.106','192.168.0.175','独孤求败','你哀求');
把前面两个改成你的本机IP试验一下
hbzhengyi 2003-02-12
  • 打赏
  • 举报
回复
kuangning给的代码怎么不行呀,另外问一下您和cg1120,如果要广播发送怎么做?
hbzhengyi 2003-02-12
  • 打赏
  • 举报
回复
..
kuangning 2003-02-12
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
NET_API_STATUS = DWord;
TLMWideChar = record
Value : PWideChar;
Length: DWord;
end;
TNetMessageBufferSend = function(ServerName, MsgName, FromName: LPCWSTR; Buffer: Pointer; BufferLen: DWord): NET_API_STATUS; stdcall;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure CvtToWideChar(const S: string; var WS: TLMWideChar);
var
S1 : string;
begin

if WS.Value <> nil then
FreeMem(WS.Value, WS.Length);
S1 := Trim(S);
if Length(S1) > 0 then begin
WS.Length := (Length(S1) + 1) * 2;
GetMem(WS.Value, WS.Length);
StringToWideChar(S1, WS.Value, WS.Length);
end else begin
WS.Length := 0;
WS.Value := nil;
end;
end;

const _NetMessageBufferSend : TNetMessageBufferSend = nil;

procedure send(servername:String;msgname:String;fromname:String;info:String);
var
NETAPI32 : THandle ;
S, M, F : TLMWideChar;
Buffer : TLMWideChar;
begin
NETAPI32 := LoadLibrary('netapi32.dll') ;
if (@_NetMessageBufferSend = nil) then
@_NetMessageBufferSend := GetProcAddress(NETAPI32, 'NetMessageBufferSend');

if (@_NetMessageBufferSend <> nil) then begin
S.Value := nil;
M.Value := nil;
F.Value := nil;
Buffer.Value := nil ;
try
CvtToWideChar(info, Buffer);
CvtToWideChar(ServerName, S);
CvtToWideChar(MsgName, M);
CvtToWideChar(FromName, F);
_NetMessageBufferSend(S.Value, M.Value, F.Value, Buffer.Value , Buffer.Length );
finally
FreeMem(S.Value, S.Length);
FreeMem(M.Value, M.Length);
FreeMem(F.Value, F.Length);
end;
end else exit ;

end;
procedure TForm1.Button1Click(Sender: TObject);
var
NETAPI32 : THandle ;
S, M, F : TLMWideChar;
Buffer : TLMWideChar;
begin
send('192.168.0.106','192.168.0.175','独孤求败','你哀求');
//说明 send(本机地址,目标地址,消息显示的本机名称,消息内容);

end;

end.
以上代码是使用'netapi32.dll'的NetMessageBufferSend函数
hbzhengyi 2003-02-12
  • 打赏
  • 举报
回复
kuangning(郎之间),我就是要代码实现winpop,给我吧,谢了
Billy_Chen28 2003-02-12
  • 打赏
  • 举报
回复
一个向局域网内的机器发送信息的例子:
function NetSend(dest, Source, Msg: string): Longint; overload;
type
TNetMessageBufferSendFunction = function(servername, msgname, fromname: PWideChar;
buf: PWideChar; buflen: Cardinal): Longint;
stdcall;
var
NetMessageBufferSend: TNetMessageBufferSendFunction;
SourceWideChar: PWideChar;
DestWideChar: PWideChar;
MessagetextWideChar: PWideChar;
Handle: THandle;
begin
Handle := LoadLibrary('NETAPI32.DLL');
if Handle = 0 then
begin
Result := GetLastError;
Exit;
end;
@NetMessageBufferSend := GetProcAddress(Handle, 'NetMessageBufferSend');
if @NetMessageBufferSend = nil then
begin
Result := GetLastError;
Exit;
end;

MessagetextWideChar := nil;
SourceWideChar := nil;
DestWideChar := nil;

try
GetMem(MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
GetMem(DestWideChar, 20 * SizeOf(WideChar) + 1);
StringToWideChar(Msg, MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
StringToWideChar(Dest, DestWideChar, 20 * SizeOf(WideChar) + 1);

if Source = '' then
Result := NetMessageBufferSend(nil, DestWideChar, nil,
MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1)
else
begin
GetMem(SourceWideChar, 20 * SizeOf(WideChar) + 1);
StringToWideChar(Source, SourceWideChar, 20 * SizeOf(WideChar) + 1);
Result := NetMessageBufferSend(nil, DestWideChar, SourceWideChar,
MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
FreeMem(SourceWideChar);
end;
finally
FreeMem(MessagetextWideChar);
FreeLibrary(Handle);
end;
end;

function NetSend(Dest, Msg: string): Longint; overload;
begin
Result := NetSend(Dest, '', Msg);
end;

function NetSend(Msg: string): Longint; overload;
begin
Result := NetSend('', '', Msg);
end;

// Example:

procedure TForm1.Button1Click(Sender: TObject);
const
NERR_BASE = 2100;
NERR_NameNotFound = NERR_BASE + 173;
NERR_NetworkError = NERR_BASE + 36;
NERR_Success = 0;
var
Res: Longint;
sMsg: string;
begin
Res := NetSend('LoginName', 'Your Message...');
case Res of
ERROR_ACCESS_DENIED: sMsg := 'user does not have access to the requested information.';
ERROR_INVALID_PARAMETER: sMsg := 'The specified parameter is invalid.';
ERROR_NOT_SUPPORTED: sMsg := 'This network request is not supported.';
NERR_NameNotFound: sMsg := 'The user name could not be found.';
NERR_NetworkError: sMsg := 'A general failure occurred in the network hardware.';
NERR_Success: sMsg := 'Message sent!';
end;
ShowMessage(sMsg);
end;
kuangning 2003-02-12
  • 打赏
  • 举报
回复
用socket、udp。
如果只是用代码实现winpop,我给你一段代码
netwolfds 2003-02-12
  • 打赏
  • 举报
回复
试试net send 机器名 hello
hbzhengyi 2003-02-12
  • 打赏
  • 举报
回复
zz

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧