Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Вниз

Как определить рабочие группы во всей локальной сети?   Найти похожие ветки 

 
yuran   (2005-07-09 18:00) [0]

??????


 
Eraser ©   (2005-07-12 14:18) [1]

 {

Сетевая утилита. Аналогична функции NetWork-
Neighborhood - Сетевое Окружение.
}

unit netres_main_unit;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,

ComCtrls, StdCtrls, Buttons, Menus, ExtCtrls;

type

TfrmMain = class(TForm)
tvResources: TTreeView;
btnOK: TBitBtn;
btnClose: TBitBtn;
Label1: TLabel;
barBottom: TStatusBar;
popResources: TPopupMenu;
mniExpandAll: TMenuItem;
mniCollapseAll: TMenuItem;
mniSaveToFile: TMenuItem;
mniLoadFromFile: TMenuItem;
grpListType: TRadioGroup;
grpResourceType: TRadioGroup;
dlgOpen: TOpenDialog;
dlgSave: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure mniExpandAllClick(Sender: TObject);
procedure mniCollapseAllClick(Sender: TObject);
procedure mniSaveToFileClick(Sender: TObject);
procedure mniLoadFromFileClick(Sender: TObject);
procedure btnOKClick(Sender: TObject);
private
ListType, ResourceType: DWORD;
procedure ShowHint(Sender: TObject);
procedure DoEnumeration;
procedure DoEnumerationContainer(NetResContainer: TNetResource);
procedure AddContainer(NetRes: TNetResource);
procedure AddShare(TopContainerIndex: Integer; NetRes:
TNetResource);

procedure AddShareString(TopContainerIndex: Integer; ItemName:
String);

procedure AddConnection(NetRes: TNetResource);
public
{ Public declarations }
end;

var

frmMain: TfrmMain;

implementation

{$R *.DFM}

procedure TfrmMain.ShowHint(Sender: TObject);
begin

barBottom.Panels.Items[0].Text:=Application.Hint;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin

Application.OnHint:=ShowHint;
barBottom.Panels.Items[0].Text:="";
end;

procedure TfrmMain.btnCloseClick(Sender: TObject);
begin

Close;
end;

{

Перечисляем все сетевые ресурсы:
}
procedure TfrmMain.DoEnumeration;
var

NetRes: Array[0..2] of TNetResource;
Loop: Integer;
r, hEnum, EntryCount, NetResLen: DWORD;
begin

case grpListType.ItemIndex of
{ Подключенные ресурсы: }
1: ListType:=RESOURCE_CONNECTED;
{ Возобновляемые ресурсы: }
2: ListType:=RESOURCE_REMEMBERED;
{ Глобальные: }
else ListType:=RESOURCE_GLOBALNET;
end;

case grpResourceType.ItemIndex of
{ Дисковые ресурсы: }
1: ResourceType:=RESOURCETYPE_DISK;
{ Принтерные ресурсы: }
2: ResourceType:=RESOURCETYPE_PRINT;
{ Все: }
else ResourceType:=RESOURCETYPE_ANY;
end;

Screen.Cursor:=crHourGlass;

try
{ Удаляем любые старые элементы из дерева: }
for Loop:=tvResources.Items.Count-1 downto 0 do
tvResources.Items[Loop].Delete;
except
end;

{ Начинаем перечисление: }
r:=WNetOpenEnum(ListType,ResourceType,0,nil,hEnum);
if r<>NO_ERROR then
begin
if r=ERROR_EXTENDED_ERROR then
MessageDlg("Невозможно сделать обзор сети."+#13+
"Произошла сетевая ошибка.",mtError,[mbOK],0)
else
MessageDlg("Невозможно сделать обзор сети.",
mtError,[mbOK],0);
Exit;
end;

try
{ Мы получили правильный дескриптор перечисления; опрашиваем ресурсы: }
while (1=1) do
begin
EntryCount:=1;
NetResLen:=SizeOf(NetRes);
r:=WNetEnumResource(hEnum,EntryCount,@NetRes,NetResLen);
case r of
0: begin
{ Это контейнер, организуем итерацию: }
if NetRes[0].dwUsage=RESOURCEUSAGE_CONTAINER then
DoEnumerationContainer(NetRes[0])
else
{ Здесь получаем подключенные и возобновляемые ресурсы: }
if ListType in [RESOURCE_REMEMBERED,RESOURCE_CONNECTED]
then

AddConnection(NetRes[0]);
end;

{ Получены все ресурсы: }
ERROR_NO_MORE_ITEMS: Break;
{ Другие ошибки: }
else begin
MessageDlg("Ошибка опроса ресурсов.",mtError,[mbOK],0);
Break;
end;
end;
end;

finally
Screen.Cursor:=crDefault;
{ Закрываем дескриптор перечисления: }
WNetCloseEnum(hEnum);
end;
end;

{

Перечисление заданного контейнера:
Данная функция обычно вызывается рекурсивно.
}
procedure TfrmMain.DoEnumerationContainer(NetResContainer:
TNetResource);
var

NetRes: Array[0..10] of TNetResource;
TopContainerIndex: Integer;
r, hEnum, EntryCount, NetResLen: DWORD;
begin

{ Добавляем имя контейнера к найденным сетевым ресурсам: }
AddContainer(NetResContainer);
{ Делаем этот элемент текущим корневым уровнем: }
TopContainerIndex:=tvResources.Items.Count-1;
{ Начинаем перечисление: }
if ListType=RESOURCE_GLOBALNET then
{ Перечисляем глобальные объекты сети: }
r:=WNetOpenEnum(ListType,ResourceType,RESOURCEUSAGE_CONTAINER,
@NetResContainer,hEnum)
else
{ Перечисляем подключаемые и возобновляемые ресурсы (другие получить здесь невозможно):
}

r:=WNetOpenEnum(ListType,ResourceType,RESOURCEUSAGE_CONTAINER,
nil,hEnum);
{ Невозможно перечислить ресурсы данного контейнера;
выводим соответствующее предупреждение и едем дальше: }
if r<>NO_ERROR then
begin
AddShareString(TopContainerIndex,"<Не могу опросить ресурсы
(Ошибка #"+

IntToStr(r)+">");
WNetCloseEnum(hEnum);
Exit;
end;


 
Eraser ©   (2005-07-12 14:18) [2]

{ Мы получили правильный дескриптор перечисления; опрашиваем ресурсы: }
while (1=1) do
begin
EntryCount:=1;
NetResLen:=SizeOf(NetRes);
r:=WNetEnumResource(hEnum,EntryCount,@NetRes,NetResLen);
case r of
0: begin
{ Другой контейнер для перечисления;
необходим рекурсивный вызов: }
if (NetRes[0].dwUsage=RESOURCEUSAGE_CONTAINER) or
(NetRes[0].dwUsage=10) then
DoEnumerationContainer(NetRes[0])
else
case NetRes[0].dwDisplayType of
{ Верхний уровень: }
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER: AddContainer(NetRes[0]);
{ Ресурсы общего доступа: }
RESOURCEDISPLAYTYPE_SHARE:
AddShare(TopContainerIndex,NetRes[0]);

end;
end;
ERROR_NO_MORE_ITEMS: Break;
else begin
MessageDlg("Ошибка #"+IntToStr(r)+" при перечислении
ресурсов.",mtError,[mbOK],0);
Break;
end;
end;
end;

{ Закрываем дескриптор перечисления: }
WNetCloseEnum(hEnum);
end;

procedure TfrmMain.FormShow(Sender: TObject);
begin

DoEnumeration;
end;

{

Добавляем элементы дерева; помечаем, что это контейнер:
}
procedure TfrmMain.AddContainer(NetRes: TNetResource);
var

ItemName: String;
begin

ItemName:=Trim(String(NetRes.lpRemoteName));
if Trim(String(NetRes.lpComment))<>"" then
begin
if ItemName<>"" then ItemName:=ItemName+" ";
ItemName:=ItemName+"("+String(NetRes.lpComment)+")";
end;
tvResources.Items.Add(tvResources.Selected,ItemName);
end;

{

Добавляем дочерние элементы к контейнеру, обозначенному как текущий верхний уровень:
}
procedure TfrmMain.AddShare(TopContainerIndex: Integer; NetRes:
TNetResource);
var

ItemName: String;
begin

ItemName:=Trim(String(NetRes.lpRemoteName));
if Trim(String(NetRes.lpComment))<>"" then
begin
if ItemName<>"" then ItemName:=ItemName+" ";
ItemName:=ItemName+"("+String(NetRes.lpComment)+")";
end;

tvResources.Items.AddChild(tvResources.Items[TopContainerIndex],ItemName);
end;

{

Добавляем дочерние элементы к контейнеру, обозначенному как текущий верхний уровень;
это просто добавляет строку для таких задач, как, например,
перечисление контейнера. То есть некоторые контейнерные
ресурсы общего доступа нам не доступны.
}
procedure TfrmMain.AddShareString(TopContainerIndex: Integer;
ItemName: String);
begin

tvResources.Items.AddChild(tvResources.Items[TopContainerIndex],ItemName);
end;

{

Добавляем соединения к дереву.
По большому счету к этому моменту все сетевые ресурсы типа
возобновляемых и текущих соединений уже отображены.
}
procedure TfrmMain.AddConnection(NetRes: TNetResource);
var

ItemName: String;
begin

ItemName:=Trim(String(NetRes.lpLocalName));
if Trim(String(NetRes.lpRemoteName))<>"" then
begin
if ItemName<>"" then ItemName:=ItemName+" ";
ItemName:=ItemName+"-> "+Trim(String(NetRes.lpRemoteName));
end;
tvResources.Items.Add(tvResources.Selected,ItemName);
end;

{

Раскрываем все контейнеры дерева:
}
procedure TfrmMain.mniExpandAllClick(Sender: TObject);
begin

tvResources.FullExpand;
end;

{

Схлопываем все контейнеры дерева:
}
procedure TfrmMain.mniCollapseAllClick(Sender: TObject);
begin

tvResources.FullCollapse;
end;

{

Записываем дерево в выбранном файле:
}
procedure TfrmMain.mniSaveToFileClick(Sender: TObject);
begin

if dlgSave.Execute then
tvResources.SaveToFile(dlgSave.FileName);
end;

{

Загружаем дерево из выбранного файла:
}
procedure TfrmMain.mniLoadFromFileClick(Sender: TObject);
begin

if dlgOpen.Execute then
tvResources.LoadFromFile(dlgOpen.FileName);
end;

{

Обновляем:
}
procedure TfrmMain.btnOKClick(Sender: TObject);
begin

DoEnumeration;
end;

end.  



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.035 c
4-1124816571
NikNet
2005-08-23 21:02
2005.10.30
Как узнать что превилигия включена или выключена?


14-1128687194
Prohodil Mimo
2005-10-07 16:13
2005.10.30
2 вопроса про приобретение Delphi.


14-1128948874
Green-Templar
2005-10-10 16:54
2005.10.30
Удобочитаемость исходников


14-1128802429
Bogdan1024
2005-10-09 00:13
2005.10.30
дизайн программы под ВинХП


1-1128196844
bva
2005-10-02 00:00
2005.10.30
Создание таблицы в Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский