Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как найти все комьютеры в сети

Delphi , Интернет и Сети , Сеть



Автор: http://forum.vingrad.ru

unit FindComp;

interface

uses
  Windows, Classes;

function FindComputers: DWORD;

var
  Computers: TStringList;

implementation

uses
  SysUtils;

const
  MaxEntries = 250;

function FindComputers: DWORD;

var
  EnumWorkGroupHandle, EnumComputerHandle: THandle;
  EnumError: DWORD;
  Network: TNetResource;
  WorkGroupEntries, ComputerEntries: DWORD;
  EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
  EnumBufferLength: DWORD;
  I, J: DWORD;

begin

  Computers.Clear;

  FillChar(Network, SizeOf(Network), 0);
  with Network do
  begin
    dwScope := RESOURCE_GLOBALNET;
    dwType := RESOURCETYPE_ANY;
    dwUsage := RESOURCEUSAGE_CONTAINER;
  end;

  EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network,
    EnumWorkGroupHandle);

  if EnumError = NO_ERROR then
  begin
    WorkGroupEntries := MaxEntries;
    EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
    EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries,
      @EnumWorkGroupBuffer, EnumBufferLength);

    if EnumError = NO_ERROR then
    begin
      for I := 1 to WorkGroupEntries do
      begin
        EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0,
          @EnumWorkGroupBuffer[I], EnumComputerHandle);
        if EnumError = NO_ERROR then
        begin
          ComputerEntries := MaxEntries;
          EnumBufferLength := SizeOf(EnumComputerBuffer);
          EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries,
            @EnumComputerBuffer, EnumBufferLength);
          if EnumError = NO_ERROR then
            for J := 1 to ComputerEntries do
              Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3,
                Length(EnumComputerBuffer[J].lpRemoteName) - 2));
          WNetCloseEnum(EnumComputerHandle);
        end;
      end;
    end;
    WNetCloseEnum(EnumWorkGroupHandle);
  end;

  if EnumError = ERROR_NO_MORE_ITEMS then
    EnumError := NO_ERROR;
  Result := EnumError;

end;

initialization

  Computers := TStringList.Create;

finalization

  Computers.Free;

end.

Программа Delphi, называемая FindComp, предназначена для поиска всех компьютеров в сети и хранения их имен в списке TStringList под названием Computers. Программа использует функцию Windows API WNetOpenEnum для перечисления ресурсов сети и WNetEnumResource для получения информации о каждом ресурсе.

Рассмотрим, как работает программа:

  1. Программа начинает с очистки списка Computers.
  2. Затем она создает структуру TNetResource, используемую для указания области, типа и использования для перечисления сети.
  3. Программа вызывает функцию WNetOpenEnum для начала процесса перечисления сети. Если процесс успешен, программа получает.handle контекста перечисления (EnumWorkGroupHandle) и устанавливает некоторые переменные для дальнейшей обработки.
  4. Программа затем проходит через каждый элемент работы группы (до максимального количества MaxEntries) с помощью функции WNetEnumResource. Для каждого элемента она вызывает функцию WNetOpenEnum снова, чтобы получить.handle контекста перечисления компьютеров (EnumComputerHandle).
  5. Внутри цикла перечисления компьютеров программа получает информацию о каждом ресурсе компьютера с помощью функции WNetEnumResource и добавляет имя компьютера (без.trailing backslash) в список Computers.
  6. Наконец, программа закрывает handles перечисления и возвращает код ошибки.

Некоторые примечания к коду:

  • Список TStringList создается в разделе инициализации и освобождается в разделе финализации, что обеспечивает правильное выделение и освобождение памяти.
  • Программа использует функцию Copy для извлечения имени компьютера из поля lpRemoteName структуры TNetResource. Это потому, что поле lpRemoteName содержит полный путь к ресурсу (включая trailing backslash), а мы хотим только имя компьютера.
  • Программа проверяет ошибки с помощью переменной EnumError, которая устанавливается функциями Windows API. Если происходит ошибка, программа возвращает код ошибки.

Альтернативное решение - использовать функцию WinAPI.GetNetworkComputerNames из модуля Delphi Win32 для получения списка имен компьютеров в сети. Вот пример реализации:

function FindComputers: TStringList;
var
  ComputerNames: array[0..255] of PChar;
  Count: DWORD;
begin
  Result := TStringList.Create;

  WinAPI.GetNetworkComputerNames(@ComputerNames, SizeOf(ComputerNames), Count);
  for var I := 0 to Count - 1 do
    Result.Add(ComputerNames[I]);
end;

Функция использует функцию GetNetworkComputerNames для получения списка имен компьютеров и хранения их в списке TStringList. Обратите внимание, что эта функция доступна только на Windows Vista и более поздних версиях.

В статье описывается алгоритм поиска всех компьютеров в сети, реализованный на языке Pascal с использованием функции WNetEnumResource и других WinAPI-интерфейсов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сеть ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 03:11:38/0.0034770965576172/0