断掉网络,断掉和那机子的连接,就返回一个false。
连上机子,就返回true。
该怎么写呢?谢谢
连上机子,就返回true。
该怎么写呢?谢谢
解决方案 »
- TDBGRIDE 是哪个里面的控件,是第三方控件吗?哪有下载
- 简单问题急问
- 家里被盗,郁闷,散分
- ADOQuery的查询后用Navigater的操作出现的问题,请指教,谢谢
- 关于fastreport得问题
- 打开窗体文件会导致delphi6.0自动关闭
- 如何分离包含tab分隔符的字符串?
- 关于Form的public变量问题?(初学者问题)
- IdHTTP.Post 模拟提交服务器 提示500错误
- :在三层结构中,激活客户端的clientdataset时出错,错误提示如下:
- 刚开始学真的问题很多,大家不要笑我(很急)我本想给出好多分,但页面显示是0,唉
- 各位大哥,ADODataSet结合ComboBox.text的SQL语句怎么写?
function ping(ipaddress:string):boolean;
var
icmp:Ticmp;
i:integer
begin
icmp:=ticmp.Create;
try
icmp.Address :=ipaddress;
i:=icmp.Ping;
finally
icmp.Destroy;
end;
if i=0 then
result:=false
else
result:=true;
end;
有哪些计算机与自己的电脑连接?bbkxjy, 时间:2001-5-31 20:23:57, ID:549334
const
MaxNetArrayItems = 512;
type
TSessionInfo50 = packed record
sesi50_cname: PChar; //remote computer name (connection id in Netware)
sesi50_username: PChar;
sesi50_key: DWORD; // used to delete session (not used in Netware)
sesi50_num_conns: Word;
sesi50_num_opens: Word; //not available in Netware
sesi50_time: DWORD;
sesi50_idle_time: DWORD; //not available in Netware
sesi50_protocol: Char;
padl: Char;
end; TNetSessionEnum = function (const pszServer: PChar; sLevel: SmallInt;
pbBuffer: Pointer; cbBuffer: Word; var pcEntriesRead: Word;
var pcTotalAvail: Word): DWORD; stdcall;
procedure GetNetSessions(ComputerNames: TStrings);
var
SessionInfo: array[0..MaxNetArrayItems] of TSessionInfo50;
EntriesRead, TotalAvail: Word;
I: Integer;
Str: string;
NetSessionEnum: TNetSessionEnum;
LibHandle: THandle;
begin
ComputerNames.Clear;
LibHandle := LoadLibrary('SVRAPI.DLL');
if LibHandle <> 0 then
begin
try
@NetSessionEnum := GetProcAddress(LibHandle, 'NetSessionEnum');
if (@NetSessionEnum <> nil) then
if NetSessionEnum(nil, 50, @SessionInfo, Sizeof(SessionInfo), EntriesRead, TotalAvail) = 0 then
begin
for I := 0 to EntriesRead - 1 do
with SessionInfo[I] do
begin
SetString(Str, sesi50_cname, StrLen(sesi50_cname));
ComputerNames.Add(Str);
end;
end;
finally
FreeLibrary(LibHandle);
end;
end;
end;
连接的计算机名存放在 ComputerNames 中.
Function TFrm_main.GetGroupList(Var List: TStringList): Boolean;
Type
TNetResourceArray = ^TNetResource; //网络类型的数组
Var
NetResource: TNetResource;
Buf: Pointer;
Count, BufSize, Res: DWORD;
lphEnum: THandle;
p: TNetResourceArray;
i, j: SmallInt;
NetworkTypeList: TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil, lphEnum);
If Res <> NO_ERROR Then exit; //Raise Exception(Res);//执行失败
//获取整个网络中的网络类型信息
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
If (Res = ERROR_NO_MORE_ITEMS) Or (Res <> NO_ERROR) Then Exit;
P := TNetResourceArray(Buf);
For i := 0 To Count - 1 Do //记录各个网络类型的信息
Begin
NetworkTypeList.Add(p);
Inc(P);
End;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
If Res <> NO_ERROR Then exit;
For j := 0 To NetworkTypeList.Count - 1 Do //列出各个网络类型中的所有工作组名称
Begin //列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^); //网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
If Res <> NO_ERROR Then break; //执行失败
While true Do //列举一个网络类型的所有工作组的信息
Begin
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
//获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
//资源列举完毕 //执行失败
If (Res = ERROR_NO_MORE_ITEMS) Or (Res <> NO_ERROR) Then break;
P := TNetResourceArray(Buf);
For i := 0 To Count - 1 Do //列举各个工作组的信息
Begin
List.Add(StrPAS(P^.lpRemoteName)); //取得一个工作组的名称
Inc(P);
End;
End;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
If Res <> NO_ERROR Then break; //执行失败
End;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;Procedure TFrm_main.BitBtn_smClick(Sender: TObject);
Var
strlist, userlist: TStringList;
i, j: integer;
Begin
strlist := TStringList.Create;
userlist := TStringList.Create;
If GetGroupList(strlist) Then
Begin
For i := 0 To strlist.Count - 1 Do //添加工作组
Begin
TreeView_fwq.Items[0].DeleteChildren;
TreeView_fwq.Items.AddChild(TreeView_fwq.Items[0], strlist[i]);
If GetUsers(strlist[i], userlist) Then
Begin
For j := 0 To userlist.Count - 1 Do
TreeView_fwq.Items.AddChild(TreeView_fwq.Items[0].Item[i], userlist[j]);
End;
End;
End;
TreeView_fwq.FullExpand;
End;Function TFrm_main.GetUsers(GroupName: String; Var List: TStringList): Boolean;
Type
TNetResourceArray = ^TNetResource; //网络类型的数组
Var
i: Integer;
Buf: Pointer;
Temp: TNetResourceArray;
lphEnum: THandle;
NetResource: TNetResource;
Count, BufSize, Res: DWord;
Begin
Result := False;
List.Clear;
FillChar(NetResource, SizeOf(NetResource), 0); //初始化网络层次信息
NetResource.lpRemoteName := @GroupName[1]; //指定工作组名称
NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER; //类型为服务器(工作组)
NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;
NetResource.dwScope := RESOURCETYPE_DISK; //列举文件资源信息
//获取指定工作组的网络资源句柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource, lphEnum);
If Res <> NO_ERROR Then Exit; //执行失败
While True Do //列举指定工作组的网络资源
Begin
Count := $FFFFFFFF; //不限资源数目
BufSize := 8192; //缓冲区大小设置为8K
GetMem(Buf, BufSize); //申请内存,用于获取工作组信息
//获取计算机名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If Res = ERROR_NO_MORE_ITEMS Then break; //资源列举完毕
If (Res <> NO_ERROR) Then Exit; //执行失败
Temp := TNetResourceArray(Buf);
For i := 0 To Count - 1 Do //列举工作组的计算机名称
Begin
//获取工作组的计算机名称,+2表示删除"",如wangfajun=>wangfajun
List.Add(Temp^.lpRemoteName + 2);
inc(Temp);
End;
End;
Res := WNetCloseEnum(lphEnum); //关闭一次列举
If Res <> NO_ERROR Then exit; //执行失败
Result := True;
FreeMem(Buf);
End;
{Create Class,Class Name is ICMP }
constructor TICMP.Create;varWSAData: TWSAData;begin hICMP := INVALID_HANDLE_VALUE; FSize := 56; FTTL := 64; FTimeOut := 100;// initialise winsock if WSAStartup($101, WSAData) <> 0 then raise TICMPException.Create('Error initialising Winsock');// register the icmp.dll stuff hICMPdll := LoadLibrary(icmpDLL); if hICMPdll = 0 then raise TICMPException.Create('Unable to register ' + icmpDLL); @ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile'); @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle'); @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho'); if (@ICMPCreateFile = Nil) or (@IcmpCloseHandle = Nil) or (@IcmpSendEcho = Nil) then raise TICMPException.Create('Error loading dll functions'); hICMP := IcmpCreateFile; if hICMP = INVALID_HANDLE_VALUE then raise TICMPException.Create('Unable to get ping handle');end;{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{Destroy Class ICMP}
destructor TICMP.Destroy;begin if hICMP <> INVALID_HANDLE_VALUE then IcmpCloseHandle(hICMP); if hICMPdll <> 0 then FreeLibrary(hICMPdll); WSACleanup; inherited Destroy;end;{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}function MinInteger(X, Y: Integer): Integer;begin if X >= Y then Result := Y else Result := X;end;{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}procedure TICMP.ResolveAddr;varPhe : PHostEnt; // HostEntry buffer for name lookupbegin// Convert host address to IP address FIPAddress := inet_addr(PChar(FAddress)); if FIPAddress <> INADDR_NONE then// Was a numeric dotted address let it in this format FHostName := FAddress else begin// Not a numeric dotted address, try to resolve by name Phe := GetHostByName(PChar(FAddress)); if Phe = nil then begin FLastError := GetLastError; if Assigned(FOnDisplay) then FOnDisplay(Self, 'Unable to resolve ' + FAddress); Exit; end; FIPAddress := longint(plongint(Phe^.h_addr_list^)^); FHostName := Phe^.h_name; end; FHostIP := StrPas(inet_ntoa(TInAddr(FIPAddress))); FAddrResolved := TRUE;end;{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}procedure TICMP.SetAddress(Value : String);begin// Only change if needed (could take a long time) if FAddress = Value then Exit; FAddress := Value; FAddrResolved := FALSE;// ResolveAddr;end;{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}function TICMP.GetErrorString : String;begin case FLastError of IP_SUCCESS: Result := 'No error'; IP_BUF_TOO_SMALL: Result := 'Buffer too small'; IP_DEST_NET_UNREACHABLE: Result := 'Destination network unreachable'; IP_DEST_HOST_UNREACHABLE: Result := 'Destination host unreachable'; IP_DEST_PROT_UNREACHABLE: Result := 'Destination protocol unreachable'; IP_DEST_PORT_UNREACHABLE: Result := 'Destination port unreachable'; IP_NO_RESOURCES: Result := 'No resources'; IP_BAD_OPTION: Result := 'Bad option'; IP_HW_ERROR: Result := 'Hardware error'; IP_PACKET_TOO_BIG: Result := 'Packet too big'; IP_REQ_TIMED_OUT: Result := 'Request timed out'; IP_BAD_REQ: Result := 'Bad request'; IP_BAD_ROUTE: Result := 'Bad route'; IP_TTL_EXPIRED_TRANSIT: Result := 'TTL expired in transit'; IP_TTL_EXPIRED_REASSEM: Result := 'TTL expired in reassembly'; IP_PARAM_PROBLEM: Result := 'Parameter problem'; IP_SOURCE_QUENCH: Result := 'Source quench'; IP_OPTION_TOO_BIG: Result := 'Option too big'; IP_BAD_DESTINATION: Result := 'Bad Destination'; IP_ADDR_DELETED: Result := 'Address deleted'; IP_SPEC_MTU_CHANGE: Result := 'Spec MTU change'; IP_MTU_CHANGE: Result := 'MTU change'; IP_GENERAL_FAILURE: Result := 'General failure'; IP_PENDING: Result := 'Pending'; else Result := 'ICMP error #' + IntToStr(FLastError); end;end;{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}function TICMP.Ping : Integer;varBufferSize: Integer;pReqData, pData: Pointer;pIPE: PIcmpEchoReply; // ICMP Echo reply bufferIPOpt: TIPOptionInformation; // IP Options for packet to sendMsg: String;begin Result := 0; FLastError := 0; if not FAddrResolved then ResolveAddr; if FIPAddress = INADDR_NONE then begin FLastError := IP_BAD_DESTINATION; if Assigned(FOnDisplay) then FOnDisplay(Self, 'Invalid host address'); Exit; end;// Allocate space for data buffer space BufferSize := SizeOf(TICMPEchoReply) + FSize; GetMem(pReqData, FSize); GetMem(pData, FSize); GetMem(pIPE, BufferSize); try// Fill data buffer with some data bytes FillChar(pReqData^, FSize, $20); Msg := 'Pinging from Delphi code written by F. Piette'; Move(Msg[1], pReqData^, MinInteger(FSize, Length(Msg))); pIPE^.Data := pData; FillChar(pIPE^, SizeOf(pIPE^), 0); if Assigned(FOnEchoRequest) then FOnEchoRequest(Self); FillChar(IPOpt, SizeOf(IPOpt), 0); IPOpt.TTL := FTTL; Result := IcmpSendEcho(hICMP, FIPAddress, pReqData, FSize, @IPOpt, pIPE, BufferSize, FTimeOut); FLastError := GetLastError; FReply := pIPE^; if Assigned(FOnEchoReply) then FOnEchoReply(Self, Result); finally// Free those buffers FreeMem(pIPE); FreeMem(pData); FreeMem(pReqData); end;end;end.