![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Взял уже готовый модуль
Код:
unit NetUtils; interface uses Windows, Classes; function GetContainerList(ListRoot:PNetResource):TList; type {$H+} PNetRes = ^TNetRes; TNetRes = record dwScope : Integer; dwType : Integer; dwDisplayType : Integer; dwUsage : Integer; LocalName : string; RemoteName : string; Comment : string; Provider : string; end; {H-} implementation uses SysUtils; type PnetResourceArr = ^TNetResource; function GetContainerList(ListRoot:PNetResource):TList; {возвращает список сетевых имён с подуровня ListRoot, каждый элемент списка TList - это PNetRec, где поле 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_DISK, RESOURCEUSAGE_CONTAINER{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 // Требуется копирование из буфера, так как он // действителен только до следующего вызова функций группы WNet New(TempRec); TempRec^.dwScope := P^.dwScope; TempRec^.dwType := P^.dwType ; TempRec^.dwDisplayType := P^.dwDisplayType ; TempRec^.dwUsage := P^.dwUsage ; {имеются ввиду вот эти указатели} TempRec^.LocalName := StrPas(P^.lpLocalName); {в смысле - строки PChar} TempRec^.RemoteName := StrPas(P^.lpRemoteName); 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; end. Беда в определении полного пути, не указывает пользователей. Пробую так: Код:
var List:TList; i:integer; begin List:=TList.Create; List:=GetContainerList(nil); // Получили список сетей. List:=GetContainerList(List[1]); //Получаем список доменов сети //список пуст if List=nil then begin ShowMessage('Не найдено'); exit; end; for i:=0 to List.Count-1 do if PNetRes(List[i])^.RemoteName='WORKGROUP' then begin List:=GetContainerList(List[i]); Break; end; for i := 0 to List.Count-1 do ShowMessage(PNetRes(List[i])^.RemoteName); end; lpRemoteName по идее должен возвращать имя сетевого ресурса примерно такого вида Цитата:
Цитата:
В чем может быть проблема? Среда разработки RAD Studio XE7 Последний раз редактировалось MotoArhangel, 29.01.2015 в 12:34. |
#2
|
||||
|
||||
![]() Откуда вы выдрали эту муть с функциями StrPas? В коде под Delphi XE7 не должно быть вызовов этих функций, они только для обратной совместимости с кодом под Windows 3.x. Перепишите по-человечески, с SetString или хотя бы StrLenW, и всё заработает. Наверняка где-то размер буфера в байтах считается, а не в WideChar-ах.
Не стоит путать форумы с богадельнями. © Bargest |