Кактус
21.01.2006 - 12:57
Вот есть у меня такой вопросик: как бы мне от Windows получить список компьютеров, подключенных к сети. Желательно на Паскале, но тексты Си, Basica, Java и т.д. тоже принимаются.
Уже спасибо.
Вот, порылся у себя на компе в доках, может тебе поможет:
Код |
>> Выводит Список компьютеров в локальной сети
Зависимости: Смотрите uses Автор: Mirag, wwwMirage@yandex.ru, Mirag Copyright: Mirag Дата: 14 ноября 2002 г. ***************************************************** }
unit Net;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, Buttons, ImgList, ExtCtrls;
type TNetForm = class(TForm) ListView1: TListView; ImageList1: TImageList; Button1: TButton; Edit1: TEdit; Timer: TTimer; Label1: TLabel; Button2: TButton; { procedure FormShow(Sender: TObject);} procedure BitBtn2Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure TimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject);
private { Private declarations } public { Public declarations } function FillNetLevel(xxx: PNetResource; list: TListItems): Word; function GetComputer: string; end;
var NetForm: TNetForm; name_server: integer; implementation uses main, Info, Network_connect; {$R *.DFM}
function TNetForm.FillNetLevel(xxx: PNetResource; List: TListItems): Word; type PNRArr = ^TNRArr; TNRArr = array[0..59] of TNetResource; var x: PNRArr; tnr: TNetResource; I: integer; EntrReq, SizeReq, twx: THandle; WSName: string; LI: TListItem; begin
Result := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, xxx, twx); if Result = ERROR_NO_NETWORK then Exit; if Result = NO_ERROR then begin New(x); EntrReq := 1; SizeReq := SizeOf(TNetResource) * 59; while (twx <> 0) and (WNetEnumResource(twx, EntrReq, x, SizeReq) <> ERROR_NO_MORE_ITEMS) do begin for i := 0 to EntrReq - 1 do begin Move(x^[i], tnr, SizeOf(tnr)); case tnr.dwDisplayType of RESOURCEDISPLAYTYPE_SERVER: begin if tnr.lpRemoteName <> '' then WSName := tnr.lpRemoteName else WSName := tnr.lpComment; LI := list.Add; LI.Caption := copy(WSName, 3, length(WSName) - 2); //list.Add(WSName);
end; else FillNetLevel(@tnr, list); end; end; end; //Dispose(x); WNetCloseEnum(twx); end; end;
{procedure TNetForm.FormShow(Sender: TObject); begin ListView1.Items.Clear; FillNetLevel(nil,ListView1.Items); end;}
function TNetForm.GetComputer: string; begin result := ''; if (ShowModal = mrok) and (ListView1.Selected <> nil) then result := ListView1.Selected.Caption; end;
procedure TNetForm.BitBtn2Click(Sender: TObject); begin ModalResult := mrcancel; end;
procedure TNetForm.BitBtn1Click(Sender: TObject); begin modalresult := mrok; end;
procedure TNetForm.Button1Click(Sender: TObject); var i: integer; j: integer; name, k: string; begin try ListView1.Items.Clear; FillNetLevel(nil, ListView1.Items); i := ListView1.Items.Count; edit1.Text := IntToStr(i); i := ListView1.Items.Count; edit1.Text := IntToStr(i);
//i:=0; if i = 0 then begin Messagebox(0, 'Не найден ни один сетевой ресурс!' + #13#10+ 'Вероятно ваша сеть неисправна!' + #13#10+ 'Попробуйте перезагрузить компьютер.', 'Внимание!', MB_OK); Main_form.Edit1.Text := 'FALSE'; end;
if i > 0 then begin Messagebox(0, 'Найдены сетевые ресурсы!' + #13#10+'Ваша сеть исправна!', 'Внимание!', MB_OK); Main_form.Edit1.Text := 'TRUE'; end; button1.Enabled := false; except messagebox(0, 'Невозможно выполнить задачу', 'Внимание', MB_OK); end;
end;
procedure TNetForm.Button2Click(Sender: TObject); begin close; end;
procedure TNetForm.TimerTimer(Sender: TObject); begin if ListView1.Items.Count = 0 then close; end;
procedure TNetForm.FormCreate(Sender: TObject); begin button1.Enabled := true; end;
end.
|
DjPUH-RYAZAN
10.09.2006 - 05:16
Можа поможет...
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.
Вот ещё....
function TNetForm.FillNetLevel(xxx: PNetResource; List: TListItems): Word;
type
PNRArr = ^TNRArr;
TNRArr = array[0..59] of TNetResource;
var
x: PNRArr;
tnr: TNetResource;
I: integer;
EntrReq,
SizeReq,
twx: THandle;
WSName: string;
LI: TListItem;
begin
Result := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER, xxx, twx);
if Result = ERROR_NO_NETWORK then
Exit;
if Result = NO_ERROR then
begin
New(x);
EntrReq := 1;
SizeReq := SizeOf(TNetResource) * 59;
while (twx <> 0) and
(WNetEnumResource(twx, EntrReq, x, SizeReq) <> ERROR_NO_MORE_ITEMS) do
begin
for i := 0 to EntrReq - 1 do
begin
Move(x^[i], tnr, SizeOf(tnr));
case tnr.dwDisplayType of
RESOURCEDISPLAYTYPE_SERVER:
begin
if tnr.lpRemoteName <> '' then
WSName := tnr.lpRemoteName
else
WSName := tnr.lpComment;
LI := list.Add;
LI.Caption := copy(WSName, 3, length(WSName) - 2);
//list.Add(WSName);
end;
else
FillNetLevel(@tnr, list);
end;
end;
end;
Dispose(x);
WNetCloseEnum(twx);
end;
end;
Пример вызова:
FillNetLevel(nil, ListView1.Items);
Ну и ещё вот...
function EnumerateFunc(hwnd: HWND; hdc: HDC; lpnr: PNetResource): Boolean;
const
cbBuffer: DWORD = 16384; // 16K is a good size
var
hEnum, dwResult, dwResultEnum: DWORD;
lpnrLocal: array
[0..16384 div SizeOf(TNetResource)] of TNetResource;
// pointer to enumerated structures
i: integer;
cEntries: Longint;
begin
centries := -1; // enumerate all possible entries
// Call the WNetOpenEnum function to begin the enumeration.
dwResult := WNetOpenEnum(
RESOURCE_CONTEXT, // Enumerate currently connected resources.
RESOURCETYPE_DISK, // all resources
0, // enumerate all resources
lpnr, // NULL first time the function is called
hEnum // handle to the resource
);
if (dwResult <> NO_ERROR) then
begin
// Process errors with an application-defined error handler
Result := False;
Exit;
end;
// Initialize the buffer.
FillChar(lpnrLocal, cbBuffer, 0);
// Call the WNetEnumResource function to continue
// the enumeration.
dwResultEnum := WNetEnumResource(hEnum, // resource handle
DWORD(cEntries), // defined locally as -1
@lpnrLocal, // LPNETRESOURCE
cbBuffer); // buffer size
// This is just printing
for i := 0 to cEntries - 1 do
begin
// loop through each structure and
// get remote name of resource... lpnrLocal[i].lpRemoteName)
end;
// Call WNetCloseEnum to end the enumeration.
dwResult := WNetCloseEnum(hEnum);
if (dwResult <> NO_ERROR) then
begin
// Process errors... some user defined function here
Result := False;
end
else
Result := True;
end;
Может это подойти...
var
Computer: array[1..500] of string[25];
ComputerCount: Integer;
procedure FindAllComputers(Workgroup: string);
var
EnumHandle: THandle;
WorkgroupRS: TNetResource;
Buf: array[1..500] of TNetResource;
BufSize: Integer;
Entries: Integer;
Result: Integer;
begin
ComputerCount := 0;
Workgroup := Workgroup + #0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
with WorkgroupRS do
begin
dwScope := 2;
dwType := 3;
dwDisplayType := 1;
dwUsage := 2;
lpRemoteName := @Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY,
0,
@WorkgroupRS,
EnumHandle);
repeat
Entries := 1;
BufSize := SizeOf(Buf);
Result :=
WNetEnumResource(EnumHandle,
Entries,
@Buf,
BufSize);
if (Result = NO_ERROR) and (Entries = 1) then
begin
Inc(ComputerCount);
Computer[ComputerCount] := StrPas(Buf[1].lpRemoteName);
end;
until (Entries <> 1) or (Result <> NO_ERROR);
WNetCloseEnum(EnumHandle);
end; { Find All Computers }
Если чё, пиши...
Infest
24.11.2006 - 00:38
Народ, вот я намыл Делфу седьмую, кой какие навыки програмирования у меня есть (в Паскале чуток, да ХТМЛ), с чего мне начать Делфу? А то я чего-то немного не воткнул сразу... =)
купи книгу Бобровского. Для начала самое то
Infest
25.11.2006 - 01:01
Чё за Бобровскго? Скажи плиз полное название.
C. Бобровский "Учебный курс" я за 140 руб. покупал в Барсе
Night_storm
2.04.2007 - 23:09
Я рекомендую "Билию Делфи" М. Фленова, а потом его же "Делфи глазами хакера", а так же "Делфи:народные советы" А.Шкрыля. Все продается в Барсе.
GrayDoberman
4.04.2007 - 11:12
Ну про книги можно вечно говорить, вот тебе сайтик с корторого можно слить клансную прогу с интереснейшими примерами:
http://delphiworld.narod.ru/
Zemond
20.05.2008 - 23:16
А еще лучше начать с чужих программ и манов с инета + книжек издательства "ПИТЕР" очень кстати не плохие книжечки(их стоимость кстати очень и очень не большая, в чем их большой плюс), конечно совсем начальный уровень, но в начале очень не плохо понять что к чему на нормальном русском языке а не на техническом в котором понимаешь только предлоги и не которые слова..=( ну а потом уже можно взять что-то посерьезней. Вот кстати не плохой сайтик электронных книжек по дельфям и не только:
http://c-books.info/books/load.php?ty=delphiА насчет книжек серии "Глазами хакера" если честно то имхо это бред полный..если не много погуглить то можно найти целые конференции по обсуждению этих книг, но вот хороших отзывов по ним мало, да и будучи сам в барсе просмотрел парочку, материал мне не очень понравился, половина статей содрана с инета, что-то разбиралось в журнале "Хакер" есть лишь крупица интересного и то, до этого при желании можно додуматься самому, а не тратить 150р если не больше на эту книгу.