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

Как узнать доступные сетевые pесуpсы

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

Как узнать доступные сетевые pесуpсы

Автор: Nomadic

Любовь в интернете: С тобой мечтаю поболтать до боли в пальцах...


type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray =
  array [0..MaxInt div SizeOf(TNetResource) - 1] of TNetResource;

procedure EnumResources(LpNR:PNetResource);
var
  NetHandle: THandle;
  BufSize: Integer;
  Size: Integer;
  NetResources: PNetResourceArray;
  Count: Integer;
  NetResult: Integer;
  I: Integer;
  NewItem: TListItem;
begin
  if WNetOpenEnum(
  RESOURCE_GLOBALNET,
  RESOURCETYPE_ANY,
  // RESOURCETYPE_ANY - все ресурсы
  // RESOURCETYPE_DISK - диски
  // RESOURCETYPE_PRINT - принтеры
  0, LpNR, NetHandle) <> NO_ERROR then
    Exit;
  try
    BufSize := 50 * SizeOf(TNetResource);
    GetMem(NetResources, BufSize);
    try
      while True do
      begin
        Count := -1;
        Size := BufSize;
        NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size);
        if NetResult = ERROR_MORE_DATA then
        begin
          BufSize := Size;
          ReallocMem(NetResources, BufSize);
          Continue;
        end;
        if NetResult <> NO_ERROR then
          Exit;
        for I := 0 to Count-1 do
        begin
          with NetResources^[I] do
          begin
            if RESOURCEUSAGE_CONTAINER = (DwUsage and RESOURCEUSAGE_CONTAINER) then
              EnumResources(@NetResources^[I]);

            if dwDisplayType = RESOURCEDISPLAYTYPE_SHARE then
            // ^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
            // RESOURCEDISPLAYTYPE_SERVER - компьютер
            // RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа
            // RESOURCEDISPLAYTYPE_GENERIC - сеть
            begin
              NewItem:= Form1.ListView1.Items.Add;
              NewItem.Caption:=LpRemoteName;
            end;
          end;
        end
      end;
    finally
      FreeMem(NetResources, BufSize);
    end;
  finally
    WNetCloseEnum(NetHandle);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  OldCursor: TCursor;
begin
  OldCursor:= Screen.Cursor;
  Screen.Cursor:= crHourGlass;
  with ListView1.Items do
  begin
    BeginUpdate;
    Clear;
    EnumResource(nil);
    EndUpdate;
  end;
  Screen.Cursor:= OldCursor;
end;

Автор: Михаил Немцов

обнаружил и исправил некоторые ошибки. Его код публикуется ниже:


type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..MaxInt div SizeOf(TNetResource) - 1] of TNetResource;


Procedure EnumResources(LpNR:PNetResource);
Var
NetHandle: DWORD;
BufSize: DWORD;
Size:DWORD;
NetResources: PNetResourceArray;
Count: DWORD;
NetResult:Integer;
I: Integer;
NewItem:TListItem;
Begin

If WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,LpNR,NetHandle) <> NO_ERROR
then Exit;
Try
BufSize := 50 * SizeOf(TNetResource);
GetMem(NetResources, BufSize);
Try
while True do
begin
Count := 1;
Size := BufSize;
NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size);
If NetResult = ERROR_MORE_DATA then
begin
BufSize := Size;
ReallocMem(NetResources, BufSize);
Continue;
end;
if NetResult <> NO_ERROR then Exit;
For I := 0 to Count-1 do
Begin
With NetResources^[I] do
Begin
If RESOURCEUSAGE_CONTAINER =(DwUsage and RESOURCEUSAGE_CONTAINER) then
EnumResources(@NetResources^[I]);
If dwDisplayType = RESOURCEDISPLAYTYPE_SHARE Then
// ^^^^^^^^^^^^^^^^^^^^^^^^^ - ресурс
// RESOURCEDISPLAYTYPE_SERVER - компьютер
// RESOURCEDISPLAYTYPE_DOMAIN - рабочая группа
// RESOURCEDISPLAYTYPE_GENERIC - сеть
Begin
NewItem:= Form1.ListView1.Items.Add;
NewItem.Caption:=LpRemoteName;
End;
End;
End;
End;
finally
FreeMem(NetResources, BufSize);
end;
finally
WNetCloseEnum(NetHandle);
end;
End;

procedure TForm1.Button1Click(Sender: TObject);
Var

OldCursor: TCursor;
begin

OldCursor:= Screen.Cursor;
Screen.Cursor:= crHourGlass;
With ListView1.Items do
Begin
BeginUpdate;
Clear;
EnumResources(nil);
EndUpdate;
End;
Screen.Cursor:= OldCursor;
end;

end.

Это код-snippet на языке Delphi, который использует функции Windows API WNetOpenEnum и WNetEnumResource для отображения доступных сетевых ресурсов (например, общих папок, принтеров, дисков) на локальной машине в списке виджете.

Процесс работы следующий:

  1. Процедура EnumResources открывает обзорный.handle с помощью WNetOpenEnum с флагом RESOURCE_GLOBALNET, который указывает, что мы хотим отобразить все доступные сетевые ресурсы.
  2. Затем она enters цикл, где она вызывает WNetEnumResource повторно, пока не будет больше ресурсов для извлечения. Каждый раз, когда она извлекает ресурсы, она проверяет, есть ли более данных и реаллокирует память соответственно.
  3. Для каждого извлеченного ресурса она проверяет поле dwDisplayType для определения типа ресурса (например, общая папка, принтер, диск). Если это общая папка, она добавляет элемент в список виджете с именем папки как его заголовком.

Событийный обработчик кнопки Button1Click запускает процесс отображения ресурсов. Он устанавливает курсор в виде часов, вызывает EnumResources с нулевым указателем (nil) для начала обзора и затем сбрасывает курсор обратно к нормальному.

Обратите внимание, что этот код использует функции динамического управления памятью Delphi (например, GetMem, ReallocMem, FreeMem) для аллокации и деаллокации памяти для массива ресурсов. Он также использует функцию WNetCloseEnum для закрытия обзорного.handle после завершения.

В исправленной версии кода, предложенной Михаилом Немцовым, были исправлены следующие ошибки:

  • Типовые объявления были исправлены.
  • Переменная BufSize была объявлена как DWORD, что соответствует типу, ожидаемому функцией WNetEnumResource.
  • Цикл в процедуре EnumResources был изменен для итерации только один раз (Count := 1;) и затем проверки наличия более данных. Это避яет бесконечный цикл.

В целом, этот код предоставляет основной пример использования Delphi и Windows API для отображения сетевых ресурсов. Однако он может требовать дополнительного обработки ошибок и функциональности в зависимости от конкретных требований вашего приложения.

Как узнать доступные сетевые ресурсы на компьютере: описывается способ использования функции WNetOpenEnum для просмотра доступных сетевых ресурсов, а также пример кода на Delphi для реализации этой задачи.


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

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




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


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


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:18:48/0.0040161609649658/0