📄 tools.pas
字号:
unit Tools;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls,winsock, ExtCtrls, Buttons, StdCtrls, Spin, Menus;
type
TNbtRecord = packed record
IpAddr, GroupName, HostName, UserName: string[15]; //array [1..15] of char;
MacAddr: string[17]; //array [1..17] of char;
//Separator: char;
end;
TToolsForm = class(TForm)
PageCtrl: TPageControl;
FindIpTabSheet: TTabSheet;
TopPanel: TPanel;
BtnCheckIP: TSpeedButton;
Label1: TLabel;
Edit1: TEdit;
IPListView: TListView;
Panel2: TPanel;
Radio1: TRadioButton;
Radio2: TRadioButton;
NbtTabSheet: TTabSheet;
Panel1: TPanel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
btnNbtStart: TSpeedButton;
edtNbtIP1: TEdit;
edtNbtIP2: TEdit;
spInterval: TSpinEdit;
lvNbt: TListView;
btnNbt: TSpeedButton;
pnlStatus: TPanel;
cbIP: TCheckBox;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
cbAddToTree: TCheckBox;
TCPScanTabSheet: TTabSheet;
Panel3: TPanel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
SpeedButton1: TSpeedButton;
btnScanPort: TSpeedButton;
edtScanIP1: TEdit;
edtScanIP2: TEdit;
spTimeOut: TSpinEdit;
lvPortScan: TListView;
Label10: TLabel;
cbScanPort1: TComboBox;
Panel4: TPanel;
Label11: TLabel;
cbAddToTree2: TCheckBox;
PingTabSheet: TTabSheet;
Panel5: TPanel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
SpeedButton2: TSpeedButton;
btnPing: TSpeedButton;
edtPing1: TEdit;
edtPing2: TEdit;
spPingTime: TSpinEdit;
lvPing: TListView;
Panel6: TPanel;
cbAddToTree3: TCheckBox;
Label16: TLabel;
SendMsgTabSheet: TTabSheet;
memMsg: TMemo;
Panel7: TPanel;
btnSendMsg: TSpeedButton;
Label17: TLabel;
cbToHost: TComboBox;
cbClearMsg: TCheckBox;
lvSendMsg: TListView;
Splitter1: TSplitter;
Panel8: TPanel;
SaveDlg: TSaveDialog;
NbtDbTabSheet: TTabSheet;
lvNbtDb: TListView;
Panel9: TPanel;
lvSearchResult: TListView;
Splitter2: TSplitter;
Panel10: TPanel;
cbField: TComboBox;
btnSearchField: TButton;
Label18: TLabel;
Label19: TLabel;
edtSearch: TEdit;
Panel11: TPanel;
Label20: TLabel;
Label21: TLabel;
cbScanPort2: TComboBox;
Label22: TLabel;
Bevel1: TBevel;
IPCfgTabSheet: TTabSheet;
btnSort: TSpeedButton;
cbNbtDataLoad: TCheckBox;
Bevel2: TBevel;
Panel16: TPanel;
lvIpAddrRange: TListView;
Panel17: TPanel;
Panel14: TPanel;
lvIpAddr: TListView;
Panel15: TPanel;
memIpCfg: TMemo;
Splitter3: TSplitter;
btnRefreshIpCfg: TButton;
Splitter4: TSplitter;
Panel12: TPanel;
Label23: TLabel;
btnDelIpRange: TButton;
procedure FormCreate(Sender: TObject);
procedure BtnCheckIPClick(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Radio1Click(Sender: TObject);
procedure Radio2Click(Sender: TObject);
procedure btnNbtClick(Sender: TObject);
procedure lvNbtDblClick(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure btnScanPortClick(Sender: TObject);
procedure lvPortScanDblClick(Sender: TObject);
procedure PageCtrlChange(Sender: TObject);
procedure btnPingClick(Sender: TObject);
procedure lvPingDblClick(Sender: TObject);
procedure btnSendMsgClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lvSendMsgDblClick(Sender: TObject);
procedure btnSearchFieldClick(Sender: TObject);
procedure btnSortClick(Sender: TObject);
procedure cbScanPort1Change(Sender: TObject);
procedure lvIpAddrDblClick(Sender: TObject);
procedure btnRefreshIpCfgClick(Sender: TObject);
procedure cbNbtDataLoadClick(Sender: TObject);
procedure lvIpAddrRangeDblClick(Sender: TObject);
procedure btnDelIpRangeClick(Sender: TObject);
private
{ Private declarations }
NbtHasItem: boolean;
PingHasItem: boolean;
PortScanHasItem: boolean;
CurListView: TListView;
//SaveFileName: string;
PreviousPortScanIP: string;
procedure SaveNbtData;
procedure LoadNbtData;
procedure AddNbtData(Item: TListItem);
procedure SaveAddrRange;
procedure LoadAddrRange;
//----------------nbtstat---------------
procedure NbtEndEvent(Sender: TObject);
procedure NbtSendEvent(Sender: TObject);
procedure NbtAddNodeEvent(Sender: TObject);
//--------------scan prot---------------
procedure PortShowProgress(Sender: TObject);
procedure PortOnConnect(Sender: TObject);
procedure PortOnExitScan(Sender: TObject);
//--------------ping--------------------
procedure PingReply(Sender: TObject);
procedure PingBegin(Sender: TObject);
procedure PingEnd(Sender: TObject);
procedure PingSend(Sender: TObject);
//--------------send message-------------
procedure SendMsgResultEvent(Sender: TObject);
public
{ Public declarations }
//StrListIP:TStringList;
procedure AddIpAddrRange(ip1, ip2: string);
end;
type CheckType = (Name2IP, IP2Name);
TGetIPThread=class(TThread)
public
//index:integer;
check_type:CheckType;
sIP,hostName:string;
MyListitem:TListitem;
protected
procedure Execute; override;
procedure AddItem;
Procedure AddResult;
//procedure SaveToList;
end;
var
ToolsForm: TToolsForm;
implementation
uses Main, Nbtstat, TCPScan, FmxUtils, PingThread, SendMsgUnit, IpCfg;
{$R *.DFM}
procedure TGetIPThread.AddItem;
var
listitem: TListitem;
begin
with ToolsForm do
begin
ListItem:=IPListview.Items.Insert(0);
MyListItem:=ListItem;
MyListItem.Caption := hostName;
MyListitem.SubItems.add(sIP);
end;
end;
procedure TGetIPThread.AddResult;
begin
with ToolsForm do
begin
MyListItem.Caption := hostName;
MyListitem.SubItems[0]:=sIP;
end;
end;
procedure TGetIPThread.Execute;
var
WSAData: TWSAData;
HostEnt: PHostEnt;
netaddr: u_long;
begin
synchronize(AddItem);
WSAStartup(2, WSAData);
case check_type of
Name2IP:
begin
HostEnt := gethostbyname(PChar(hostName));
if HostEnt <> nil then
with HostEnt^ do
sIP := Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])])
else sIP:='未知';
end;
IP2Name:
begin
netaddr:=inet_addr(Pchar(sIP));
HostEnt:=GetHostbyaddr(pchar(@netaddr),30,0);
if HostEnt <> nil then HostName:=strpas(HostEnt.h_name)
else HostName:='未知';
end;
end;//end of case;
WSACleanup;
synchronize(AddResult);
//synchronize(SaveToList);
end;
procedure TToolsForm.FormCreate(Sender: TObject);
var
i: integer;
begin
//StrListIP:=TStringList.Create;
if bk<>nil then Brush.Bitmap := bk;
Nbt := TNbt.Create(self);
Nbt.MyListView := lvNbt;
edtNbtIP1.Text := Nbt_IP1;
edtNbtIP2.Text := Nbt_IP2;
edtScanIP1.Text := ScanPort_IP1;
edtScanIP2.Text := ScanPort_IP2;
edtPing1.Text := Ping_IP1;
edtPing2.Text := Ping_IP2;
if FileExists('SendToHost.txt') then cbToHost.Items.LoadFromFile('SendToHost.txt');
if (not MainForm.bNotAutoSaveNbt) then
begin
LoadNbtData;
end
else
begin
cbNbtDataLoad.Checked := true;
lvSearchResult.Enabled := false;
lvNbtDb.Enabled := false;
label18.Enabled := false;
label19.Enabled := false;
label20.Enabled := false;
cbField.Enabled := false;
edtSearch.Enabled := false;
btnSearchField.Enabled := false;
btnSort.Enabled := false;
end;
for i := 0 to lvNbtDb.Columns.Count - 1 do cbField.Items.Add(lvNbtDb.Columns[i].Caption);
cbField.ItemIndex := 0;
EnumInterfaces;
LoadAddrRange;
end;
procedure TToolsForm.BtnCheckIPClick(Sender: TObject);
var GetIPThread:TGetIPThread;
begin
if Radio1.Checked then //主机名->IP地址
begin
GetIPThread:=TGetIPThread.Create(true);
GetIPThread.FreeOnTerminate := true;
GetIPThread.check_type := Name2IP;
GetIPThread.hostName := Edit1.Text;
GetIPThread.sIP:='正在查找.....';
GetIPThread.Resume;
end
else
begin
if IsLegalIP(Edit1.Text) then //IP地址->主机名
begin
GetIPThread:=TGetIPThread.Create(true);
GetIPThread.FreeOnTerminate := true;
GetIPThread.check_type := IP2Name;
GetIPThread.sIP:=Edit1.Text;
GetIPThread.hostName := '正在查找.....';
GetIPThread.Resume;
end
else ShowMessage(Edit1.text+'不是合法的IP地址');
end;
Edit1.Text := '';
end;
procedure TToolsForm.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_return then BtnCheckIPClick(Self);
end;
procedure TToolsForm.Radio1Click(Sender: TObject);
begin
Label1.Caption := '主机名(域名):';
Edit1.SetFocus;
end;
procedure TToolsForm.Radio2Click(Sender: TObject);
begin
Label1.Caption := 'IP地址:';
Edit1.SetFocus;
end;
procedure TToolsForm.btnNbtClick(Sender: TObject);
begin
if btnNbt.Tag = 0 then
begin
btnNbt.Tag := 1;
btnNbt.Caption := '停止';
NbtHasItem := false;
if (not IsLegalIP(edtNbtIP1.Text))or(not IsLegalIP(edtNbtIP2.Text)) then
begin
ShowMessage('IP地址非法,请重新输入');
exit;
end;
//btnNbt.Enabled := False;
edtNbtIP1.Enabled := false;
edtNbtIP2.Enabled := false;
spInterval.Enabled := false;
//BorderIcons := [{biSystemMenu,}biMaximize];
{Nbt := TNbt.Create(self);
Nbt.MyListView := lvNbt; } //FormCreate
Nbt.StartIP := edtNbtIP1.Text;
Nbt.EndIP := edtNbtIP2.Text;
Nbt.wait_time := spInterval.Value;
Nbt.OnEndEvent := NbtEndEvent;
Nbt.OnSendEvent := NbtSendEvent;
Nbt.OnAddNodeEvent := NbtAddNodeEvent;
Nbt.Start;
end
else
begin
btnNbt.Tag := 0;
btnNbt.Caption := '开始';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -