Программирование гнёзд. Первая программа для работы с гнёздами:
Сегодня я продолжу рассказывать о функциях для работы с гнёздами. Возьми исходники проги, по которой мы будем обучаться здесь. Программа вытаскивает сведения о структуре сети. Функции из этой программы я ещё не рассматривал, поэтому новой инфы тебе будет достаточно. Меня очень сильно поругали за то, что примеры я даю на Delphi, а функции в этом разделе описываются в стандарте языка С++. Ну что поделаешь если я привык сетевые функции так описывать. Сегодня я решил исправиться, все функции будут описываться в стандарте Delphi, как я это делаю в других статьях журнала.
Рис 1. Форма
Ты можешь полюбоваться результатом работы сегодняшней проги на рисунке 1. А я перехожу к рассмотрению кода. Я не буду объяснять работу каждой строчки, как в других статьях, а объясню только сетевые функции. Если ты читал другие мои статьи и имеешь представление о Delphi, то с работой программы сможешь разобраться сам.
function WNetOpenEnum(
dwScope, dwType, dwUsage: DWORD;
lpNetResource: PNetResource;
var lphEnum: Thandle
): DWORD; stdcall;
Эта функция запускается у меня первой. Она открывает перечисление сетевых устройств в локальной сети. Рассмотрим передаваемые ей параметры:
dwScope - Какие ресурсы будут включаться в перечисление. Возможны комбинации следующих значений:
RESOURCE_GLOBALNET - все ресурсы сети;
RESOURCE_CONNECTED - подключённые;
RESOURCE_REMEMBERED - запомненные;
dwType - тип ресурсов включаемых в перечисления. Возможны комбинации следующих значений:
RESOURCETYPE_ANY - все ресурсы сети;
RESOURCETYPE_DISK - сетевые диски;
RESOURCETYPE_PRINT - сетевые принтеры;
dwUsage - использование ресурсов включаемых в перечисления. Возможны значения:
0 - все ресурсы сети;
RESOURCEUSAGE_CONNECTABLE - подключаемые;
RESOURCEUSAGE_CONTAINER- контейнерные;
lpNetResource - Указатель на структуру NETRESOURCE . Если этот параметр равен нулю, то перечисление начнётся с самой верхней ступени иерархии сетевых ресурсов. Ноль я ставлю для того, чтобы получить самый первый ресурс. После этого я передаю в качестве этого параметра указатель на уже найденный ресурс. Тогда перечисление начнётся с найденного и продолжится дальше. Так я повторяю, пока не найдутся все ресурсы.
lphEnum - Это указатель, который понадобится в функции WnetEnumResource
Теперь нужно рассмотреть структуру NETRESOURCE . В Delphi есть три разновидности этой функции: NETRESOURCE, NETRESOURCEА и NETRESOURCEW. Отличаются они последней буквой в названии и типом строк.
Что такое dwScope, dwType и dwUsage ты уже знаешь, поэтому их я опускаю. А вот остальные я рассмотрю.
dwDisplayType - Как должен отображаться ресурс:
RESOURCEDISPLAYTYPE_DOMAIN - это домен;
RESOURCEDISPLAYTYPE_GENERIC - нет значения;
RESOURCEDISPLAYTYPE_SERVER - сервер;
RESOURCEDISPLAYTYPE_SHARE - разделяемый ресурс;
lpLocalName - локальное имя
lpRemoteName - удалённое имя
lpComment - комментарий
lpProvider - Хозяин ресурса. Параметр может быть 0, если хозяин неизвестен.
Теперь можно переходить к следующей функции:
function WNetEnumResource(
hEnum: THandle; var lpcCount: DWORD;
lpBuffer: Pointer;
var lpBufferSize: DWORD
): DWORD; stdcall;
hEnum - указатель на возвращённое функцией WNetOpenEnum значение.
lpcCount - максимальное количество возвращаемых значений. Не стесняйся, ставь 2000. Если ты засунешь сюда 0xFFFFFFFF, то перечисляться все ресурсы. После выполнения, функция засунет сюда фактическое число найденных ресурсов.
lpBuffer - указатель на буфер, в который будет помещён результат.
lpBufferSize -Размер буфера.
После вызова этой функции, я добавляю найденные ресурсы с помощью:
function ShowResource(const ParentNode: TTreeNode;
Res: TNetResource): TTreeNode;
var
Str:String;
index:Integer;
begin
Result:=ParentNode;
if Res.lpRemoteName=nil then exit;
Str:=string(Res.lpRemoteName);
index:=Pos('\',Str);
While index>0 do
begin
Str:=Copy(Str,index+1,Length(Str));
index:=Pos('\',Str);
end;
Result := TreeTreeRes.Items.AddChild(ParentNode, Str);
end;
Всё очень просто и со вкусом. На сегодня хватит. Поговорим о сетях в следующем номере.