![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прога, которая ищет все компы в локальной сети
Perf © (2003-11-17 18:47:00)
Мне нужно сделать прогу, которая ищет все компы в локальной сети.Код проги у меня уже есть, но я не могу заставить вывести результат работы программы на форму!
Помогите пожалуйста, очень нужно!!!
Вот код проги:
Ниже представлена функция FindComputers, которая заполняет StringList именами компьютеров:
unit FindComp;
interface
uses
Windows, Classes;
function FindComputers: DWORD;
var
Computers: TStringList;
implementation
uses
SysUtils;
const
MaxEntries = 250;
function FindComputers: DWORD;
var
EnumWorkGroupHandle, EnumComputerHandle: THandle;
EnumError: DWORD;
Network: TNetResource;
WorkGroupEntries, ComputerEntries: DWORD;
EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
EnumBufferLength: DWORD;
I, J: DWORD;
begin
Computers.Clear;
FillChar(Network, SizeOf(Network), 0);
with Network do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle);
if EnumError = NO_ERROR then
begin
WorkGroupEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
begin
for I := 1 to WorkGroupEntries do
begin
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[I], EnumComputerHandle);
if EnumError = NO_ERROR then
begin
ComputerEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumComputerBuffer);
EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
for J := 1 to ComputerEntries do
Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));
WNetCloseEnum(EnumComputerHandle);
end;
end;
end;
WNetCloseEnum(EnumWorkGroupHandle);
end;
if EnumError = ERROR_NO_MORE_ITEMS then
EnumError := NO_ERROR;
Result := EnumError;
end;
initialization
Computers := TStringList.Create;
finalization
Computers.Free;
end.
Perf (2003-12-25 15:50:00) [1]
Удалено модератором
Примечание: Заведи новую ветвь... Оффтоп...
Rouse_ (2003-12-16 22:12:00) [2]
Ну да желательно чтобы
Scan(nrResource[i], false);не проводился если самого ресурса нет (т.е. и подресурсов у него тоже нет)... хотя критической ошибки конечно не будет... т.к. этому препятствует...if dwResult = NO_ERROR then
Желаю успехов
Perf (2003-12-16 22:03:00) [3]
Т.е. надо отделить в отдельный begin и end ?
Rouse_ (2003-12-16 10:20:00) [4]
> if Root = True then //
Эта переменная будет True только в одном случае при первом вызове функции..., кстати данную строку лучше заменить наif Root then
Применяется она для выбора между двумя типами вызовов функции WNetOpenEnum
С передачей в качестве одного из параметров @Res, или без него...
WNetOpenEnum - предназначена для начала перечисления сетевых ресурсов подробнее в справке...
> if dwResult = NO_ERROR then //
Это проверка результата выполнения функции WNetOpenEnum
> dwSize := SizeOf(nrResource);//
> numEntries := DWORD(-1);//
Тут инициализируем необходимые параметры...
> if WNetEnumResource(hEnum, numEntries, @nrResource, dwSize)
> = NO_ERROR then
Начинаем перечисление сетевых ресурсов список найденых ресурсов сохраниться в nrResource а их кол-во в numEntries
> for i := 0 to numEntries - 1 do
Соответственно зная кол-во ресурсов начинаем их смотреть...
> if nrResource[i].lpRemoteName <> nil then//
> Form1.Memo1.Lines.Add(nrResource[i].lpRemoteName);//
Если имя ресурса есть, выводим его в Memo1
> Scan(nrResource[i], false);//
И запускаем рекурсивно этуже функцию на поиск всех подресурсов данного сетевого ресурса...
И еще желательно этот кусок переписать вот так:
begin
if nrResource[i].lpRemoteName <> nil then
begin
Form1.Memo1.Lines.Add(nrResource[i].lpRemoteName);//
Scan(nrResource[i], false);//
end;
end;
> WNetCloseEnum(hEnum);//
Ну и закрытие перечисления...
Perf (2003-12-15 18:33:00) [5]
Вот этот основной кусок не понятен в осмыслении. Я вот указал слеши, можно там комментарии увидеть? Тогда сразу станет ясно и вопросов не возникнет:)
if Root = True then //
dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, nil, hEnum)//
else
dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, @Res, hEnum);//
if dwResult = NO_ERROR then //
begin
dwSize := SizeOf(nrResource);//
numEntries := DWORD(-1);//
if WNetEnumResource(hEnum, numEntries, @nrResource, dwSize) = NO_ERROR then//
begin
for i := 0 to numEntries - 1 do//
begin
if nrResource[i].lpRemoteName <> nil then//
Form1.Memo1.Lines.Add(nrResource[i].lpRemoteName);//
Scan(nrResource[i], false);//
end;
end;
WNetCloseEnum(hEnum);//
Yaro (2003-12-14 19:24:00) [6]
Удалено модератором
Rouse_ (2003-12-14 17:17:00) [7]
> [14] Perf © (14.12.03 15:51)
Что именно не понятно? Укажи строку...
PS: Вообщето все хорошо в хелпе описано...
Perf (2003-12-14 15:51:00) [8]
Хотелось бы разобраться с кодом конкретнее. Хорошо бы было получить комментарии к коду последней программы. Кому по силам?
Yaro (2003-12-13 17:12:00) [9]
Удалено модератором
Примечание: Следим за темой... Оффтоп...
Perf (2003-12-12 18:37:00) [10]
Удалено модератором
Примечание: Прямое обращение запрещено... У меня есть адрес...
Rouse_ (2003-12-03 00:07:00) [11]
Применительно к данному алгоритму нельзя...
Желаю успехов
Perf (2003-12-02 20:51:00) [12]
Я так и думал, что все дело в вызове)
Я вот в прогу добавил возможности определения имя компа, пользователя.
Еще хотелось бы добавить progress bar для того, что бы пока компы находятся, шла строка загрузки, это вобще возможно в этом случае?) А то с винампом у меня получалось это ставить, а вот с этим не получается пока, хотя вроде это наверно просто... Но у меня что то не выходит
Rouse_ (2003-11-29 21:02:00) [13]
Не за что ;)
В твоем коде просто отсутствовал рекурсивный вызов...
Perf (2003-11-29 18:07:00) [14]
Большое тебе спасибо, очень помог.
Rouse_ (2003-11-29 12:57:00) [15]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Scan(Res: TNetResource; Root: boolean);
var
hEnum: cardinal;
nrResource: array[0..512] of TNetResource;
dwSize: DWORD;
numEntries: DWORD;
i: DWORD;
dwResult: DWORD;
begin
if Root = True then
dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
0, nil, hEnum)
else
dwResult := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
0, @Res, hEnum);
if dwResult = NO_ERROR then
begin
dwSize := SizeOf(nrResource);
numEntries := DWORD(-1);
if WNetEnumResource(hEnum, numEntries, @nrResource, dwSize) = NO_ERROR then
begin
for i := 0 to numEntries - 1 do
begin
if nrResource[i].lpRemoteName <> nil then
Form1.Memo1.Lines.Add(nrResource[i].lpRemoteName);
Scan(nrResource[i], false);
end;
end;
WNetCloseEnum(hEnum);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
R:TNetResource;
begin
Scan(R, True);
end;
end.
Желаю успехов
Perf (2003-11-28 23:23:00) [16]
Нет, средне специальное)) , просто указать правильно забыл.
Ну я с делфи недавно работаю.... просто парюсь именно вот с этим заданием) Ну помогите кто может, выдает прога не то что надо, хотя чувствую что истина рядом)
nikkie (2003-11-28 23:04:00) [17]
высшее образование, говоришь?
Perf (2003-11-28 22:10:00) [18]
Теперь он выводит workgroup, это конечно хорошо, но мне надо что бы он выводил список компьютеров в локалке.
Что надо подправить то?)
Rouse_ (2003-11-20 19:49:00) [19]
Замени
Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));
на
Computers.Add(EnumComputerBuffer[J].lpRemoteName);
Желаю успехов
Perf (2003-11-20 19:02:00) [20]
Спасибо за ответ!)))
Но вот возник вопросик)
Почему вместе списка компьютеров, выдает надпись:RKGROUP
Если бы он вывел надпись workgroup, то я бы подумал
что он выдает список рабочих групп. Но он выдает хрен знает что.
Мне же надо что бы программа выводила список всех компов
в лок. сети.
У меня дома есть локальная сеть состоящая из 2 компов.
Так что он должен вывести мне эти 2 компа.
Прошу вас, помогите доделать прогУ)))
Буду очень вам благодарен!