doublecmd/plugins/wfx/Network/src/netutils.pas
2009-08-02 18:58:59 +00:00

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.