Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

Прога, которая ищет все компы в локальной сети   Найти похожие ветки 

 
Perf ©   (2003-11-17 18:47) [0]

Мне нужно сделать прогу, которая ищет все компы в локальной сети.Код проги у меня уже есть, но я не могу заставить вывести результат работы программы на форму!
Помогите пожалуйста, очень нужно!!!

Вот код проги:

Ниже представлена функция 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.


 
Fay   (2003-11-17 19:15) [1]

Ку?
uses FindComp;

procedure Form1.Button1Click(Sender : TObject);
begin
FindComp.FindComputers;
Memo1.Lines.Assign(FindComp.COmputers)
end;


 
Perf ©   (2003-11-20 19:02) [2]

Спасибо за ответ!)))
Но вот возник вопросик)
Почему вместе списка компьютеров, выдает надпись:RKGROUP
Если бы он вывел надпись workgroup, то я бы подумал
что он выдает список рабочих групп. Но он выдает хрен знает что.
Мне же надо что бы программа выводила список всех компов
в лок. сети.
У меня дома есть локальная сеть состоящая из 2 компов.
Так что он должен вывести мне эти 2 компа.

Прошу вас, помогите доделать прогУ)))
Буду очень вам благодарен!


 
Rouse_ ©   (2003-11-20 19:49) [3]

Замени

Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));

на

Computers.Add(EnumComputerBuffer[J].lpRemoteName);

Желаю успехов


 
Perf ©   (2003-11-28 22:10) [4]

Теперь он выводит workgroup, это конечно хорошо, но мне надо что бы он выводил список компьютеров в локалке.
Что надо подправить то?)


 
nikkie ©   (2003-11-28 23:04) [5]

высшее образование, говоришь?


 
Perf ©   (2003-11-28 23:23) [6]

Нет, средне специальное)) , просто указать правильно забыл.
Ну я с делфи недавно работаю.... просто парюсь именно вот с этим заданием) Ну помогите кто может, выдает прога не то что надо, хотя чувствую что истина рядом)


 
Rouse_ ©   (2003-11-29 12:57) [7]

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-29 18:07) [8]

Большое тебе спасибо, очень помог.


 
Rouse_ ©   (2003-11-29 21:02) [9]

Не за что ;)
В твоем коде просто отсутствовал рекурсивный вызов...


 
Perf ©   (2003-12-02 20:51) [10]

Я так и думал, что все дело в вызове)

Я вот в прогу добавил возможности определения имя компа, пользователя.

Еще хотелось бы добавить progress bar для того, что бы пока компы находятся, шла строка загрузки, это вобще возможно в этом случае?) А то с винампом у меня получалось это ставить, а вот с этим не получается пока, хотя вроде это наверно просто... Но у меня что то не выходит


 
Rouse_ ©   (2003-12-03 00:07) [11]

Применительно к данному алгоритму нельзя...

Желаю успехов


 
Perf ©   (2003-12-12 18:37) [12]

Удалено модератором
Примечание: Прямое обращение запрещено... У меня есть адрес...


 
Yaro ©   (2003-12-13 17:12) [13]

Удалено модератором
Примечание: Следим за темой... Оффтоп...


 
Perf ©   (2003-12-14 15:51) [14]

Хотелось бы разобраться с кодом конкретнее. Хорошо бы было получить комментарии к коду последней программы. Кому по силам?


 
Rouse_ ©   (2003-12-14 17:17) [15]

> [14] Perf © (14.12.03 15:51)
Что именно не понятно? Укажи строку...

PS: Вообщето все хорошо в хелпе описано...


 
Yaro ©   (2003-12-14 19:24) [16]

Удалено модератором


 
Perf ©   (2003-12-15 18:33) [17]

Вот этот основной кусок не понятен в осмыслении. Я вот указал слеши, можно там комментарии увидеть? Тогда сразу станет ясно и вопросов не возникнет:)

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);//


 
Rouse_ ©   (2003-12-16 10:20) [18]

> 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-16 22:03) [19]

Т.е. надо отделить в отдельный begin и end ?


 
Rouse_ ©   (2003-12-16 22:12) [20]

Ну да желательно чтобы Scan(nrResource[i], false); не проводился если самого ресурса нет (т.е. и подресурсов у него тоже нет)... хотя критической ошибки конечно не будет... т.к. этому препятствует... if dwResult = NO_ERROR then

Желаю успехов


 
Perf ©   (2003-12-25 15:50) [21]

Удалено модератором
Примечание: Заведи новую ветвь... Оффтоп...



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

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
14-94095
Отшельник
2004-02-03 20:06
2004.02.29
CHM файл


1-93989
Невидимка
2004-02-17 11:28
2004.02.29
Хочу перехватить mouse wheel


3-93777
ivan01234
2004-02-03 22:08
2004.02.29
InterBase - регистрация базы данных


14-94111
Budy
2004-02-07 18:04
2004.02.29
Делаем ЧАТ


1-94023
Zvr@b
2004-02-16 21:35
2004.02.29
Как запретить пользователю вводить определённый символ (