Текущий архив: 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