Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > сеть (не 220v) :))


Автор: oleg1973 21.8.2003, 12:15
искал везде но не нашел вот решил и народа спросить
кароче суть :
как правильно работать с WNetOpenEnum,WNetEnumResource
делаю
invoke WNetOpenEnumA,RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,0,lphEnum
получаю хедер скажем так
потом
invoke WNetEnumResourceA,[lphEnum],count=0xffffffffh,buffer,bufsize=16384
получаю списочек root
нахожу в нем контейнер RESOURCEUSAGE_CONTAINER
и после этого тормоза
тоесть не пойму нада ли закрыват хедер и делать снова WNetOpenEnum но уже с заполненой struc NETRESOURCE
или просто делать WNetEnumResource опять же с заполненой struc NETRESOURCE
чтоб получить список компьютеров в сети
в инете чтото ниче конкретного не нашел
такчто ткните носом плиз smile.gif

Автор: p0s0l 21.8.2003, 12:45
WNetOpenEnum
WNetEnumResource
WNetCloseEnum

потом берешь что-нибудь из результатов енума и
WNetOpenEnum (c одним из результатов предыдущего енума)
WNetEnumResource
WNetCloseEnum

Автор: p0s0l 21.8.2003, 13:10
а лучше сделать рекурсивную процедурину, которая обшаривала бы всю сеть:

Код
procedure NetEnumerate(res : NETRESOURCE);
var
  buf : указатель на массив из NETRESOURCE;
begin
  if WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, res, EnumHandle) <> NO_ERROR then exit;
  Entries := $FFFFFFFF;
  bufSize := 16384;
  GetMem (buf, bufSize);
  WNetEnumResource(EnumHandle, Entries, buf, bufSize);
  WNetCloseEnum(EnumHandle);
  if Entries > 0 then
    for i := 0 to Entries-1 do
    begin
      if (buf[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then NetEnumerate(buf[i]);
      if (buf[i] - компьютер) then добавляешь в список компов
    end;
  FreeMem (buf);
end;


Автор: oleg1973 21.8.2003, 16:30
if (buf[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then NetEnumerate(buf[i]);


NetEnumerate это из какой dll?

Автор: p0s0l 21.8.2003, 20:53
Цитата
NetEnumerate это из какой dll?

smile.gif
Цитата
procedure NetEnumerate(res : NETRESOURCE);

это твоя рекурсивная процедура


Автор: oleg1973 22.8.2003, 16:38
не работает smile.gif
делаю
WNetOpenEnumA(2,0,0,0,&lphEnum);
WNetEnumResourceA(lphEnum,&lpcCount,buffer,&bsize);
получаю в буфере структуру
вопрос ! надо ли делать WNetCloseEnum(&lphEnum) ?
идем дальше
проверяю то что в буфере
нахожу dwUsage=RESOURCEUSAGE_CONTAINER
а теперь вопрос знатокам!
дальше как?smile.gif
я так понимаю что найденый dwUsage=RESOURCEUSAGE_CONTAINER
нада передать в WNetEnumResourceA(lphEnum,&lpcCount,buffer,&bsize);
как?smile.gif

Автор: p0s0l 22.8.2003, 18:16
Насчет моего примера: я тебе привел пример на глаз, не проверяя, и не знаю, в чем у тебя была проблема, но вот этот пример работает (находит все компы в сети):

Код
procedure NetEnumerate(NetRes : PNetResource);
type
 PResArray = ^TResArray;
 TResArray = array [0..$FFFF] of TNetResource;

var
 buf : PResArray;
 i, Entries, bufSize : cardinal;
 res : TNetResource;
 EnumHandle : THandle;

begin
 if NetRes <> nil then res := NetRes^
 else
 with res do
 begin
   FillChar(res, SizeOf(res), 0);
   dwScope := RESOURCE_GLOBALNET;
   dwType := RESOURCETYPE_ANY;
   dwDisplayType := RESOURCEDISPLAYTYPE_GENERIC;
   dwUsage := RESOURCEUSAGE_ALL;
   lpRemoteName := nil;
 end;

 if WNetOpenEnum (RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, @res, EnumHandle) <> NO_ERROR then exit;

 Entries := $FFFFFFFF;
 bufSize := 16384;
 GetMem (buf, bufSize);
 WNetEnumResource(EnumHandle, Entries, buf, bufSize);
 WNetCloseEnum(EnumHandle);
 if Entries > 0 then
   for i := 0 to Entries-1 do
   begin
     if (buf[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then NetEnumerate(@buf^[i]);
     if (buf[i].dwDisplayType = RESOURCEDISPLAYTYPE_SERVER) then Form1.ListBox1.Items.Add(buf[i].lpRemoteName);
   end;
 FreeMem (buf);
end;


Как видишь отличий от предыдущего практически нет, только добавлен код для начального енума.
Вызывается это дело так: NetEnumerate (nil);
Извини, что на Delphi, но думаю ничего сложного тут нет...
Вместо Form1.ListBox1.Items.Add(buf[i].lpRemoteName) подставь свой код - здесь в buf[i].lpRemoteName содержиться имя компа.

Можешь также юзать совместно с NetServerGetInfo для получения еще кое-какой дополнительной инфы...

Автор: SCHEPA 22.8.2003, 20:42
Цитата
WNetOpenEnumA(2,0,0,0,&lphEnum);
WNetEnumResourceA(lphEnum,&lpcCount,buffer,&bsize);
получаю в буфере структуру
вопрос ! надо ли делать WNetCloseEnum(&lphEnum) ?

Надо.

Цитата
идем дальше
проверяю то что в буфере
нахожу dwUsage=RESOURCEUSAGE_CONTAINER
а теперь вопрос знатокам!
дальше как?smile.gif
я так понимаю что найденый dwUsage=RESOURCEUSAGE_CONTAINER
нада передать в WNetEnumResourceA(lphEnum,&lpcCount,buffer,&bsize);
как?smile.gif

Идем...
WNetEnumResourceA(lphEnum,&lpcCount,buffer,&bsize) - возвращает тебе в buffer массив структур
NETRESOURCE. Выбираешь из них нужную и снова начинается
WNetOpenEnum - получаешь хендл.
WNetEnumRecource - получаешь сетевые ресурсы.
WNetCloseEnum - финиш.

Автор: SCHEPA 22.8.2003, 20:46
Вообще у меня есть прога на Билдере, так сказать первый опыт в этом деле. Там все работает. Если надо могу скинуть.

Автор: oleg1973 22.8.2003, 22:00
все народ smile.gif
сделал всем биг сенкс за советы
мне в принципе сам алгоритм тока нужен был
на асме пишется все

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)