程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> DELPHI實現網絡信使服務代碼+注釋

DELPHI實現網絡信使服務代碼+注釋

編輯:Delphi

用Delphi模擬實現Windows XP中的網絡信使服務,通過本例可以掌握如何調用Windows的DLL的函數,如何通過信使服務發送信息。既然說是網絡信使,那就需要知道目標IP,然後指定發送人信息和發送內容就可以了,可以直接調用Windows的netapi32.dll動態鏈接庫中的NetMessageBufferSend()函數發送信息了。

DELPHI實現信使服務

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 - 1of WideChar; 047   buf_: array[0..lbuf - 1of 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 = 13then 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;

運行上面的代碼試試看,是不是同樣可以發送信使服務,附帶學習了使用函數重載。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved