обнаружил и исправил некоторые ошибки. Его код публикуется ниже:
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;
BeginIf WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,LpNR,NetHandle) <> NO_ERROR
then Exit;
Try
BufSize := 50 * SizeOf(TNetResource);
GetMem(NetResources, BufSize);
TrywhileTruedobegin
Count := 1;
Size := BufSize;
NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size);
If NetResult = ERROR_MORE_DATA thenbegin
BufSize := Size;
ReallocMem(NetResources, BufSize);
Continue;
end;
if NetResult <> NO_ERROR then Exit;
For I := 0 to Count-1 doBeginWith NetResources^[I] doBeginIf 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 doBegin
BeginUpdate;
Clear;
EnumResources(nil);
EndUpdate;
End;
Screen.Cursor:= OldCursor;
end;
end.
Это код-snippet на языке Delphi, который использует функции Windows API WNetOpenEnum и WNetEnumResource для отображения доступных сетевых ресурсов (например, общих папок, принтеров, дисков) на локальной машине в списке виджете.
Процесс работы следующий:
Процедура EnumResources открывает обзорный.handle с помощью WNetOpenEnum с флагом RESOURCE_GLOBALNET, который указывает, что мы хотим отобразить все доступные сетевые ресурсы.
Затем она enters цикл, где она вызывает WNetEnumResource повторно, пока не будет больше ресурсов для извлечения. Каждый раз, когда она извлекает ресурсы, она проверяет, есть ли более данных и реаллокирует память соответственно.
Для каждого извлеченного ресурса она проверяет поле 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.