mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
116 lines
3.3 KiB
ObjectPascal
116 lines
3.3 KiB
ObjectPascal
unit NetUtils;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Classes;
|
|
|
|
Type
|
|
{$H+}
|
|
PNetRes = ^TNetRes;
|
|
|
|
TNetRes = Record
|
|
dwScope: Integer;
|
|
dwType: Integer;
|
|
dwDisplayType: Integer;
|
|
dwUsage: Integer;
|
|
LocalName: String;
|
|
RemoteName: String;
|
|
Comment: String;
|
|
Provider: String;
|
|
End;
|
|
|
|
{H-}
|
|
|
|
function GetContainerList(ListRoot: PNetResource): TList;
|
|
procedure FreeNetResList(var NetResList: TList);
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils;
|
|
|
|
type
|
|
PnetResourceArr = ^TNetResource; {TNetResource - ýòî çàïèñü,
|
|
ýêâèâàëåíòíàÿ TNetRes, çà èñêëþ÷åíèåì òîãî, ÷òî
|
|
âìåñòî òèïîâ string òàì òèïû PChar. }
|
|
|
|
function GetContainerList(ListRoot: PNetResource): TList;
|
|
{âîçâðàùàåò ñïèñîê ñåòåâûõ èì¸í ñ ïîäóðîâíÿ ListRoot, êàæäûé
|
|
ýëåìåíò ñïèñêà TList - ýòî PNetRes, ãäå ïîëå RemoteName îïðåäåëÿåò
|
|
ñîîòâåòñòâåííî ñåòåâîå èìÿ ýëåìåíòà ñïèñêà. Åñëè ListRoot=nil, òî
|
|
âîçâðàùàåòñÿ ñàìûé âåðõíèé óðîâåíü òèïà:
|
|
1. Microsoft Windows Network
|
|
2. Novell Netware Network
|
|
×òîáû ïîëó÷èòü ñïèñîê äîìåíîâ/ðàáî÷èõ ãðóïï ñåòè Microsoft, íóæíî
|
|
âûçâàòü ýòó ôóíêöèþ âòîðîé ðàç, ïåðåäàâ åé â êà÷åñòâå ïàðàìåòðà,
|
|
ñîîòâåòñòâóþùèé ýëåìåíò ñïèñêà, ïîëó÷åííîãî ïðè ïåðâîì å¸ âûçîâå.
|
|
×òîáû ïîëó÷èòü ñïèñîê êîìïüþòåðîâ äîìåíà - âûçâàòü òðåòèé ðàç...}
|
|
{Åäèíñòâåííîå, ÿ íå çíàþ êàê óçíàòü èìÿ òåêóùåãî äîìåíà.}
|
|
Var
|
|
TempRec: PNetRes;
|
|
Buf: Pointer;
|
|
Count, BufSize, Res: DWORD;
|
|
lphEnum: THandle;
|
|
p: PNetResourceArr;
|
|
i: SmallInt;
|
|
NetworkList: TList;
|
|
Begin
|
|
NetworkList := TList.Create;
|
|
Result := nil;
|
|
BufSize := 8192;
|
|
GetMem(Buf, BufSize);
|
|
Try
|
|
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, ListRoot, lphEnum);
|
|
{â ðåçóëüòàòå ïîëó÷àåì ññûëêó lphEnum}
|
|
If Res <> 0 Then
|
|
Raise Exception(Res);
|
|
Count := $FFFFFFFF; {òðåáóåì âûäàòü ñòîëüêî çàïèñåé â
|
|
ñïèñîê, ñêîëüêî åñòü}
|
|
Res := WNetEnumResource(lphEnum, Count, Buf, BufSize);
|
|
{â áóôåðå Buf - ñïèñî÷åê
|
|
â âèäå ìàññèâà óêàçàòåëåé íà ñòðóêòóðû òèïà TNetResourceArr
|
|
à â Count - ÷èñëî ýòèõ ñòðóêòóð}
|
|
If Res = ERROR_NO_MORE_ITEMS Then
|
|
Exit;
|
|
If (Res <> 0) Then
|
|
Raise Exception(Res);
|
|
P := PNetResourceArr(Buf);
|
|
For I := 0 To Count - 1 Do
|
|
Begin //Òðåáóåòñÿ êîïèðîâàíèå èç áóôåðà, òàê êàê îí
|
|
New(TempRec); //äåéñòâèòåëåí òîëüêî äî ñëåäóþùåãî âûçîâà ôóíêöèé ãðóïïû WNet
|
|
TempRec^.dwScope := P^.dwScope;
|
|
TempRec^.dwType := P^.dwType;
|
|
TempRec^.dwDisplayType := P^.dwDisplayType;
|
|
TempRec^.dwUsage := P^.dwUsage;
|
|
TempRec^.LocalName := StrPas(P^.lpLocalName); {èìåþòñÿ ââèäó âîò ýòè óêàçàòåëè}
|
|
TempRec^.RemoteName := StrPas(P^.lpRemoteName); {â ñìûñëå - ñòðîêè PChar}
|
|
TempRec^.Comment := StrPas(P^.lpComment);
|
|
TempRec^.Provider := StrPas(P^.lpProvider);
|
|
NetworkList.Add(TempRec);
|
|
Inc(P);
|
|
End;
|
|
Res := WNetCloseEnum(lphEnum);
|
|
{à ñëåäóþùèé âûçîâ - âîò îí!}
|
|
If Res <> 0 Then
|
|
Raise Exception(Res);
|
|
Result := NetWorkList;
|
|
Finally
|
|
FreeMem(Buf);
|
|
End;
|
|
End;
|
|
|
|
procedure FreeNetResList(var NetResList: TList);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := NetResList.Count - 1 downto 0 do
|
|
begin
|
|
Dispose(PNetRes(NetResList[I]));
|
|
NetResList.Delete(I);
|
|
end;
|
|
FreeAndNil(NetResList);
|
|
end;
|
|
|
|
end.
|
|
|