Проблема с WNetEnumResource
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.43] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Проблема с WNetEnumResource
|
Сообщ.
#1
,
|
|
|
|
Не работает перечисление компьютеров сети. Проводник свободно видит и работает с соседним компом, тот тоже.
Даже клиент-серверная прога ведёт обмен по TServerSocket и TClientSocket. А список компов сети получить не могу. ![]() ![]() 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. Может у кого есть рабочий код? |
|
Сообщ.
#2
,
|
|
|
|
Первое что бросается в глаза, это то что выделено памяти сильно меньше чем запрашиваете у функции данных.
![]() ![]() GetMem(Resources, BufferSize); // Только на 1 TResource А дальше у вас запрашивается ![]() ![]() Count := MAX_RES; // const MAX_RES = 1000; Res := WNetEnumResource(hEnum, Count, Resources, BufferSize); // 1000 штук Попробуйте сначала исправить это: ![]() ![]() BufferSize := SizeOf(TResources) * MAX_RES; Добавлено И сразу второе: чтобы избежать логических ошибок с зависанием / зацикливанием, не следует применять while True do Для кода, который должен быть использован повторно стоит писать отдельную функцию и вызывать её пока она возвращает результаты, а не в бесконечном цикле. |
|
Сообщ.
#3
,
|
|
|
|
Спасибо. Переделал. Но выдаёт только:
Microsoft Terminal Services Microsoft Windows Network Web Client Network В упор не видит другой комп, хотя в эксплорере->Сеть нормально открывается. |