На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Проблема с WNetEnumResource
    Не работает перечисление компьютеров сети. Проводник свободно видит и работает с соседним компом, тот тоже.
    Даже клиент-серверная прога ведёт обмен по TServerSocket и TClientSocket. А список компов сети получить не могу.

    ExpandedWrap disabled
      unit PForm;
       
      interface
       
      uses  Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls;
       
      const MAX_RES = 1000;
       
      type
       
        TMain = class(TForm)
          LB: TListBox;
          Start: TButton;
          procedure StartClick(Sender: TObject);
          private
            procedure NetEnumResources(Root: PNetResource);
        end;
       
        TNetEnumResourcesCallback = procedure(NetResource: TNetResource);
        PResources = ^TResources;
        TResources = array[0 .. MAX_RES-1] of TNetResource;
       
      var   Main: TMain;
       
      implementation {$R *.dfm}
       
      procedure TMain.StartClick(Sender: TObject);
      begin
        NetEnumResources(nil);
        LB.AddItem('stop', nil);
      end;
       
      procedure TMain.NetEnumResources(Root: PNetResource);
      var
        hEnum: THandle;
        Count,
        BufferSize,
        Res: dword;
        Resources: PResources;
        i: Integer;
      begin
        Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, Root, hEnum);
        if NO_ERROR <> Res then exit;
        BufferSize := SizeOf(TResources);
        GetMem(Resources, BufferSize);
        while True do begin
          Count := MAX_RES;
          Res := WNetEnumResource(hEnum, Count, Resources, BufferSize);
          if (Res <> NO_ERROR) and (Res <> ERROR_MORE_DATA) then break;
          for i := 0 to Count - 1 do begin
            with Resources^[i] do LB.AddItem('Local Name: ' + lpLocalName + ', ' + 'Remote Name: ' + lpRemoteName + ', ' + lpComment, nil);
            if (Resources^[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then NetEnumResources(@(Resources^[i]));
          end;
        end;
        FreeMem(Resources);
        WNetCloseEnum(hEnum);
        LB.AddItem('end', nil);
      end;
       
      end.


    Может у кого есть рабочий код?
      Первое что бросается в глаза, это то что выделено памяти сильно меньше чем запрашиваете у функции данных.
      ExpandedWrap disabled
        GetMem(Resources, BufferSize); // Только на 1 TResource

      А дальше у вас запрашивается
      ExpandedWrap disabled
            Count := MAX_RES; // const MAX_RES = 1000;
            Res := WNetEnumResource(hEnum, Count, Resources, BufferSize); // 1000 штук

      Попробуйте сначала исправить это:
      ExpandedWrap disabled
        BufferSize := SizeOf(TResources) * MAX_RES;


      Добавлено
      И сразу второе: чтобы избежать логических ошибок с зависанием / зацикливанием, не следует применять while True do

      Для кода, который должен быть использован повторно стоит писать отдельную функцию и вызывать её пока она возвращает результаты, а не в бесконечном цикле.
      Сообщение отредактировано: macomics -
        Спасибо. Переделал. Но выдаёт только:

        Microsoft Terminal Services
        Microsoft Windows Network
        Web Client Network

        В упор не видит другой комп, хотя в эксплорере->Сеть нормально открывается.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0563 ]   [ 16 queries used ]   [ Generated: 20.12.25, 02:32 GMT ]