用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;
運行上面的代碼試試看,是不是同樣可以發送信使服務,附帶學習了使用函數重載。