用Delphi模擬實現Windows XP中的網絡信使服務,通過本例可以掌握如何調用Windows的DLL的函數,如何通過信使服務發送信息。既然說是網絡信使,那就需要知道目標IP,然後指定發送人信息和發送內容就可以了,可以直接調用Windows的netapi32.dll動態鏈接庫中的NetMessageBufferSend()函數發送信息了。
Delphi網絡信使,具體代碼:
001
unit
main;
002
interface
003
uses
004
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
005
StdCtrls, ComCtrls;
006
type
007
TForm1 =
class
(TForm)
008
StatusBar1: TStatusBar;
009
Button1: TButton;
010
Button2: TButton;
011
Edit1: TEdit;
012
Label1: TLabel;
013
Label2: TLabel;
014
Memo1: TMemo;
015
Label3: TLabel;
016
Edit2: TEdit;
017
Label4: TLabel;
018
procedure
Memo1KeyDown(Sender: TObject;
var
Key:
Word
;
019
Shift: TShiftState);
020
procedure
Button1Click(Sender: TObject);
021
procedure
Button2Click(Sender: TObject);
022
procedure
Memo1Change(Sender: TObject);
023
private
024
function
NetSend:
integer
; overload;
//函數重載
025
function
NetSend(msgname, fromname, buf:
string
):
integer
; overload;
026
{ Private declarations }
027
public
028
{ Public declarations }
029
end
;
030
function
NetMessageBufferSend(servername:
PWideChar
;
031
msgname:
PWideChar
;
032
fromname:
PWideChar
;
033
buf:
PWideChar
;
034
var
buflen:
integer
):
integer
; cdecl;
035
var
036
Form1: TForm1;
037
implementation
038
function
NetMessageBufferSend; external
'netapi32.dll'
name
'NetMessageBufferSend'
;
039
{$R *.dfm}
040
function
TForm1
.
NetSend(msgname, fromname, buf:
string
):
integer
;
041
const
042
lname =
64
;
//地址、發送人字符串的長度
043
lbuf =
1024
;
//內容的長度
044
var
045
i:
integer
;
046
msgname_, fromname_:
array
[
0..
lname -
1
]
of
WideChar
;
047
buf_:
array
[
0..
lbuf -
1
]
of
WideChar
;
048
buflen_:
integer
;
049
begin
050
//初始化全部填充#0字符
051
for
i :=
0
to
lname -
1
do
msgname_[i] := #
0
;
052
//字符串類型轉換
053
StringToWideChar(msgname, msgname_, lname);
054
for
i :=
0
to
lname -
1
do
fromname_[i] := #
0
;
055
StringToWideChar(fromname, fromname_, lname);
056
for
i :=
0
to
lbuf -
1
do
buf_[i] := #
0
;
057
StringToWideChar(buf, buf_, lbuf);
058
//調用NetMessageBufferSend()發送信息
059
Result := NetMessageBufferSend(
nil
, msgname_, fromname_, buf_, buflen_);
060
end
;
061
procedure
TForm1
.
Memo1KeyDown(Sender: TObject;
var
Key:
Word
;
062
Shift: TShiftState);
063
begin
064
if
(shift = ([ssCtrl]))
and
(key =
13
)
then
065
begin
066
Button1
.
Click;
//Ctrl+回車等同於按鈕1按下
067
end
;
068
end
;
069
function
TForm1
.
NetSend:
integer
;
070
begin
071
Result := NetSend(Edit1
.
Text, Edit2
.
Text, Memo1
.
Text);
072
end
;
073
procedure
TForm1
.
Button1Click(Sender: TObject);
074
var
075
iRet:
integer
;
076
begin
077
if
(Edit1
.
Text =
''
)
or
(Memo1
.
Text =
''
)
then
078
begin
079
StatusBar1
.
SimpleText :=
'地址或內容為空,發送失敗.'
;
080
Exit;
081
end
;
082
Button1
.
Enabled :=
False
;
083
StatusBar1
.
SimpleText :=
'正在發送...'
;
084
iRet := NetSend;
//開始發送,這裡的NetSend函數沒有帶參數,因而系統自動調用沒有參數的那個NetSend函數,這就是函數重載的作用。
085
if
iRet =
0
then
//返回信息
086
StatusBar1
.
SimpleText :=
'消息發送成功!'
087
else
088
StatusBar1
.
SimpleText := Format(
'消息發送失敗,錯誤代碼:%d.'
, [iRet]);
089
Button1
.
Enabled :=
True
;
090
end
;
091
procedure
TForm1
.
Button2Click(Sender: TObject);
092
begin
093
Close;
094
end
;
095
procedure
TForm1
.
Memo1Change(Sender: TObject);
096
var
097
i:
integer
;
098
begin
099
i := Length(Memo1
.
Text);
//統計字數,即返回Memo1中的字符串長度
100
Label4
.
Caption := Format(
'字數(%d)'
, [i]);
101
end
;
102
end
.
本程序涉及到對系統Dll文件中的函數調用,關鍵就是NetMessageBufferSend()函數的申明和使用,這裡我們只實現了基本功能,還有很多地方可以改進,例如使用多線程,接受信使消息等等功能,不過實現起來復雜一些。其實除了NetMessageBufferSend()函數可以實現信使服務,我們利用“net send”這個DOS命令同樣可以實現這個功能,例如我們做一個簡單的例子寫入如下代碼:
procedure TForm1.Button1Click(Sender: TObject); const HostName='127.0.0.1'; SendMsg='網絡信使發送測試'; var ComLine:String; begin ComLine:=Format('net send %s %s',[HostName,SendMsg]); //DOS命令 WinExec(PChar(ComLine), SW_MINIMIZE); end;
運行上面的代碼試試看,是不是同樣可以發送信使服務,附帶學習了使用函數重載。