Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по статье "Мониторинг сетей в Delphi"   Найти похожие ветки 

 
MeMO   (2004-08-06 00:46) [0]

Hi all.
У меня вопрос по выше указанной статье.
Там в примере расписано определение шар для локального компа.
Хочется узнать как это все делается для удаленного.
Я пытался написать, только работает через раз :)
Заранее спасибо.


 
Vit@ly ©   (2004-08-06 08:15) [1]

Попробуй так:
Var
NetResources: array[0..200]of TNetResource;
ResourceCount: integer;
....
implementation

{$R *.DFM}

function enumResourcesIn(Workgroup: string): boolean;
var
EnumHandle: THandle;
WorkgroupRS: TNetResource;
BufSize: Cardinal;
Entries: Cardinal;
Rest: Cardinal;
begin
ResourceCount:=0;
Workgroup:=Workgroup+#0;
FillChar(WorkgroupRS, SizeOf(WorkgroupRS), 0);
with WorkgroupRS do begin
 dwScope:=RESOURCE_GLOBALNET;
 dwType:=RESOURCETYPE_ANY;
 dwDisplayType:=RESOURCEDISPLAYTYPE_DOMAIN;
 dwUsage:=RESOURCEUSAGE_CONTAINER;
 lpRemoteName:=@Workgroup[1];
end;
WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @WorkgroupRS, EnumHandle);
Entries:=200;
BufSize:=SizeOf(NetResources);
Rest:=WNetEnumResource(EnumHandle, Entries, @NetResources[0], BufSize);
if (Rest=NO_ERROR) and (Entries>0) then Result:=true else Result:=false;
ResourceCount:=Entries;
WNetCloseEnum(EnumHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if enumResourcesIn("xxx.xxx.xxx.xxx") then  //IP удаленного компа
 for i:=1 to ResourceCount do
  begin
   Tree.Items.AddChildFirst(nil, NetResources[i].lpRemoteName);
   Application.ProcessMessages;
  end;
end;


 
Rouse_ ©   (2004-08-06 09:30) [2]

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

 PShareInfo1 = ^TShareInfo1;
 {$EXTERNALSYM _SHARE_INFO_1}
 _SHARE_INFO_1 = record
   shi1_netname: LPTSTR;
   shi1_type: DWORD;
   shi1_remark: LPTSTR;
 end;
 TShareInfo1 = _SHARE_INFO_1;
 {$EXTERNALSYM SHARE_INFO_1}
 SHARE_INFO_1 = _SHARE_INFO_1;

а по поводу сканирования через WNetEnumResource, то тут http://www.delphimaster.ru/cgi-bin/forum.pl?n=4 более полный пример


 
MeMO   (2004-08-29 17:06) [3]

За структуру спасибо только вот в массив куда шары заносятся всякая лобуда пишется. Что делать. Вот фрагмент на нахождение  шар, что неправильно:

lbxShares.Items.Clear;
if ((CompList.SelCount>0)and(CompList.Selected.ImageIndex=0))or(Manual)then begin
GetMem(Host,SizeOf(WideChar)*256);
if Manual then begin
ZeroMemory(Host,sizeof(WideChar)*256);
StringToWideChar(TempStr,Host,Length(TempStr)+1);
end else begin
if CompList.Selected.Caption = LocIP then begin
GetMem(HostPCH,256);
GetHostName(HostPCH,256);
TempStr:="";
ZeroMemory(Host,sizeof(WideChar)*256);
TempStr:="\\"+strpas(HostPCH);
StringToWideChar(TempStr,Host,Length(TempStr)+1);
FreeMem(HostPch);
end else begin
DestAddress.s_addr:=Inet_Addr(PChar(CompList.Selected.Caption));
Hosten:=GetHostByAddr(@DestAddress.s_addr,Length(CompList.Selected.Caption),AF_INET);
TempStr:="";
ZeroMemory(Host,sizeof(WideChar)*256);
TempStr:="\\"+strpas(Hosten.h_name);
StringToWideChar(TempStr,Host,Length(TempStr)+1);
end;
end;
FLibHandle := LoadLibrary("NETAPI32.DLL"); //Загружаем библиотеку
if FLibHandle = 0 then Exit;
//Связываем функцию
@NetShareEnumNT := GetProcAddress(FLibHandle,"NetShareEnum");
if not Assigned(NetShareEnumNT) then //Проверка
begin
FreeLibrary(FLibHandle);
Exit;
end;
ShareNT1:=nil; //Очищаем указатель на массив структур
//Вызов функции
if NetShareEnumNT(Host,1,@ShareNT1,Word(-1),@EntriesRead,@TotalEntries,Nil) <> 0 then
begin //Если вызов неудачен выгружаем библиотеку
FreeLibrary(FLibHandle);
MessageDlg("Shares getting error", mtError, [mbOk],0);
Exit;
end;
if entriesread > 0 then //Обработка результатов
for i:=0 to Entriesread-1 do
lbxShares.Items.Add(StrPas(ShareNT1^[i].shi1_netname));
FreeLibrary(FLibHandle); //Не забываем выгрузить библиотеку
end;

или скажите мыльник я всю прогу вышлю чтоб легче было разобраться где у меня ошибка. Заранее спасибо.


 
Дмитрий Ботвин   (2004-08-30 09:16) [4]

Я по этой статье делал так:

//определил структуру
type
 TShareInfo2 = packed record
    shi2_netname : PWChar;
    shi2_type: DWORD;
    shi2_remark :PWChar;
    shi2_permissions: DWORD;
    shi2_max_uses : DWORD;
    shi2_current_uses : DWORD;
    shi2_path : PWChar;
    shi2_passwd : PWChar;
 end;
 PShareInfo2 = ^ TShareInfo2;
 TShareInfo2Array = array [0..512] of TShareInfo2;
 PShareInfo2Array = ^ TShareInfo2Array;

//Вызов процедуры
procedure TForm8.btnGetSharesClick(Sender: TObject);
 var
   i:Integer;
   HostName: WideString;
   FLibHandle : THandle;
   ShareNT : PShareInfo2Array;
   entriesread,totalentries:DWORD;
 begin
   lbxShares.Items.Clear;
   FLibHandle := LoadLibrary("NETAPI32.DLL"); //Загружаем библиотеку
   if FLibHandle = 0 then Exit;
   //Связываем функцию
   @NetShareEnumNT := GetProcAddress(FLibHandle,"NetShareEnum");
   if not Assigned(NetShareEnumNT) then //Проверка
   begin
     FreeLibrary(FLibHandle);
     Exit;
   end;
   ShareNT := nil; //Очищаем указатель на массив структур
   //Вызов функции
   HostName:=WideString(Trim(Form1.CompName.Text));
   if NetShareEnumNT(PWideChar(HostName),2,@ShareNT,DWORD(-1),@entriesread,@totalentries,nil) <> 0 then
   begin  //Если вызов неудачен выгружаем библиотеку
     FreeLibrary(FLibHandle);
     Exit;
   end;
   if entriesread>0 then //Обработка результатов
   for i:= 0 to entriesread-1 do lbxShares.Items.Add(String(ShareNT^[i].shi2_netname));
   FreeLibrary(FLibHandle); //Не забываем выгрузить библиотеку
 end;

А вообще, помоему, Rouse_ там всё подробно расписал, за чё ему
большое человеческое спасибо :-))))


 
Rouse_ ©   (2004-08-30 09:23) [5]

Вот более правильный пример (в статье были немного не верно некоторые моменты описаны из-за чего получался на выходе Memory Leack):

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   Button1: TButton;
   Edit1: TEdit;
   procedure Button1Click(Sender: TObject);
 end;

 LMSTR = LPWSTR;
 NET_API_STATUS = DWORD;

 LPSHARE_INFO_1 = ^SHARE_INFO_1;
 {$EXTERNALSYM LPSHARE_INFO_1}
 PSHARE_INFO_1 = ^SHARE_INFO_1;
 {$EXTERNALSYM PSHARE_INFO_1}
 _SHARE_INFO_1 = record
   shi1_netname: LMSTR;
   shi1_type: DWORD;
   shi1_remark: LMSTR;
 end;
 {$EXTERNALSYM _SHARE_INFO_1}
 SHARE_INFO_1 = _SHARE_INFO_1;
 {$EXTERNALSYM SHARE_INFO_1}
 TShareInfo1 = SHARE_INFO_1;
 PShareInfo1 = PSHARE_INFO_1;

 function NetShareEnum(servername: LMSTR; level: DWORD; var bufptr: Pointer;
   prefmaxlen: DWORD; entriesread, totalentries,
   resume_handle: LPDWORD): NET_API_STATUS; stdcall; external "Netapi32.dll";
 function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall; external "Netapi32.dll";  

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type TShareInfo1Array = array of TShareInfo1;
var
 entriesread, totalentries: DWORD;
 Info: Pointer;
 I: Integer;
 CompName: PWideChar;
begin
 CompName := StringToOleStr(Edit1.Text); // Здесь имя компъютера к примеру \\SERVER1
 if NetShareEnum(CompName, 1, Info, DWORD(-1), @entriesread,
   @totalentries, nil) = 0 then
   try
     if entriesread > 0 then
       for I := 0 to entriesread - 1 do
         ListBox1.Items.Add(TShareInfo1Array(@(Info^))[I].shi1_netname);
   finally
     NetApiBufferFree(Info);
   end;
end;

end.


 
Rouse_ ©   (2004-08-30 09:24) [6]

PS:
> А вообще, помоему, Rouse_ там всё подробно расписал, за
> чё ему
> большое человеческое спасибо :-))))


Приятно слышать :)


 
Дмитрий Ботвин   (2004-08-30 09:39) [7]

Кстати, Rouse_ а в остальных функциях для работы с сетевыми
ресурсами в той статье тоже необходима NetApiBufferFree???


 
Rouse_ ©   (2004-08-30 10:27) [8]

Да, именно из-за нее и был Memory Leack.
Думаю не составит труда переписать остальные функции по образу и подобию данного мной примера...


 
Rouse_ ©   (2004-08-30 10:31) [9]

Хотя, сейчас идет работа над второй частью статьи (наконец-то:) и я собираюсь также поправить и первую часть (как на Королевстве Дельфи примерно, выйдет исправленный вариант) и там все распишу как правильно делать :)


 
Дмитрий Ботвин   (2004-08-30 11:42) [10]

А у меня лишь на некоторых компах с WinNT 4.0 тока ошибку
выдовал, но я её устранил убрав флажок Range Checking в настройках компилятора. После чего всё заработало на любых
компах. Я подумал, что это глюк тех компов :-))))

P.S. Щас попробую на тех компах исправленный вариант....


 
Дмитрий Ботвин   (2004-08-30 14:40) [11]

Rouse_ а когда ты хош 2-ю часть опубликовать? И о чём там
будет идти речь???


 
Rouse_ ©   (2004-08-30 15:18) [12]

> [11] Дмитрий Ботвин   (30.08.04 14:40)
Сканер сети, оспределенние параметров удаленной машины таких как ОС, время, ресурсы, пользователи, группы, текущие процессы... и т.д. и т.п.

Как закончу, если все нормально то недельки через 2 - 3...


 
Piter ©   (2004-08-30 15:39) [13]

Rouse_ ©   (30.08.04 10:27) [8]
Думаю не составит труда переписать остальные функции по образу и подобию данного мной примера


а чего, поправить статью совсем никак? Это же пять минут, чем в конференции каждый раз объяснятся... да и вообще некорретный ответ в форуме это ладно. А вот некорректный пример в статье гораздо хуже...


 
Дмитрий Ботвин   (2004-08-30 15:57) [14]

Rouse_ я тоже когда то написал полнофункцианальный сетевой администратор. Единственное чего не смог определить для сетевого
компа - объём оперативки на нём. Ты часом не в курсе это
вообще реально сделать???


 
Rouse_ ©   (2004-08-30 16:47) [15]

> Piter ©   (30.08.04 15:39)
Я же сказал что одновременно и в статье поправлю :)

> [14] Дмитрий Ботвин   (30.08.04 15:57)
не уверен что такое вообще возможно :)


 
Дмитрий Ботвин   (2004-08-30 16:58) [16]

Ну ты даёшь, ты меня последней надежды лишил :-((((
Нельзя же так сразу :-))))
Я, в принципе, так и предполагал, ну думал может чё не знаю.
Ну ладно, всё равно спасибо :-))))


 
MeMO   (2004-08-31 11:55) [17]

С нахождением шар все получидось, спасибо. Только вот теперь появилась проблема с их подключением. Куда писать путь к шаре?
Постоянно фу-я выдает ошибку 123. Вот фрагмент где я пытаюсь подключить шару что не так. Помогите. Заранее спасибо.


procedure TMainForm.lbxSharesDblClick(Sender: TObject);
const
 STYPE_DISKTREE = 0;
 ACCESS_ALL = 258;
var ShareNTItem : TShareInfo1;
   TmpDir:lmstr;
   TmpName: String;
   TmpDirNT, TmpNameNT: PWideChar;
   TmpLength: Integer;
begin
TmpDir:=TShareInfo1Array(@Info^)[lbxShares.ItemIndex].shi1_netname;
TmpName:=InputBox("Share name","Enter name",""); //&#206;&#239;&#240;&#229;&#228;&#229;&#235;&#255;&#229;&#236; &#232;&#236;&#255; &#239;&#238;&#228; &#234;&#238;&#242;&#238;&#240;&#251;&#236; &#238;&#237; &#225;&#243;&#228;&#229;&#242; &#226;&#232;&#228;&#229;&#237; &#226; &#241;&#229;&#242;&#232;
if TmpName="" then Exit;
if TmpDir="" then Exit;
FLibHandle:=LoadLibrary("NETAPI32.DLL");
if FLibHandle=0 then Exit;
@NetShareAdd:=GetProcAddress(FLibHandle,"NetShareAdd");
if not Assigned(NetShareAdd) then begin
FreeLibrary(FLibHandle);
Exit;
end;
TmpLength:=SizeOF(WideChar)*256; //&#206;&#239;&#240;&#229;&#228;&#229;&#235;&#255;&#229;&#236; &#237;&#229;&#238;&#225;&#245;&#238;&#228;&#232;&#236;&#251;&#233; &#240;&#224;&#231;&#236;&#229;&#240;
GetMem(TmpNameNT,sizeof(WideChar)*256); //&#202;&#238;&#237;&#226;&#229;&#240;&#242;&#232;&#240;&#243;&#229;&#236; &#226; PWChar
StringToWideChar(TmpName, TmpNameNT,sizeof(WideChar)*256);
ShareNTItem.shi1_netname := TmpNameNT; //&#200;&#236;&#255;
ShareNTItem.shi1_type := STYPE_DISKTREE; //&#210;&#232;&#239; &#240;&#229;&#241;&#243;&#240;&#241;&#224;
ShareNTItem.shi1_remark := ""; //&#202;&#238;&#236;&#236;&#229;&#237;&#242;&#224;&#240;&#232;&#233;
//ShareNTItem.shi1_permissions := ACCESS_ALL; //&#196;&#238;&#241;&#242;&#243;&#239;
//ShareNTItem.shi1_max_uses := DWORD(-1); //&#202;&#238;&#235;-&#226;&#238; &#236;&#224;&#234;&#241;&#232;&#236;. &#239;&#238;&#228;&#234;&#235;&#254;&#247;.
//ShareNTItem.shi1_current_uses := 0; //&#202;&#238;&#235;-&#226;&#238; &#242;&#229;&#234; &#239;&#238;&#228;&#234;&#235;.}

//GetMem(TmpDirNT, TmpLength);
//StringToWideChar(TmpDir, TmpDirNT, TmpLength);

//ShareNTItem.shi1_path := TmpDirNT; //&#207;&#243;&#242;&#252; &#234; &#240;&#229;&#241;&#243;&#240;&#241;&#243;
//ShareNTItem.shi1_passwd := nil; //&#207;&#224;&#240;&#238;&#235;&#252;

Error:=NetShareAdd(Host,2,@ShareNTItem,nil); //&#196;&#238;&#225;&#224;&#226;&#235;&#255;&#229;&#236; &#240;&#229;&#241;&#243;&#240;&#241;
if Error<>0 then
MessageDlg("Share add error"+Inttostr(Error),mtError,[mbOK],0);
FreeMem (TmpNameNT); //&#238;&#241;&#226;&#238;&#225;&#238;&#230;&#228;&#224;&#229;&#236; &#239;&#224;&#236;&#255;&#242;&#252;
//FreeMem (TmpDirNT);
FreeLibrary(FLibHandle);
CompList.OnDblClick(self);
end;


 
Дмитрий Ботвин   (2004-09-01 10:25) [18]

Вот тебе работающий код:

procedure TForm8.btnAddSharesClick(Sender: TObject);
 type
   TShareInfo2 = record
     shi2_netname : PWChar;
     shi2_type: DWORD;
     shi2_remark :PWChar;
     shi2_permissions: DWORD;
     shi2_max_uses : DWORD;
     shi2_current_uses : DWORD;
     shi2_path : PWChar;
     shi2_passwd : PWChar;
   end;
 const
   STYPE_DISKTREE = 0;
   ACCESS_ALL =  258;
   SHI50F_FULL = 258;
 var
   ShareNT : TShareInfo2;
   TmpDir, TmpName, Path: String;
   HostName, TmpDirNT, TmpNameNT: PWChar;
 begin
   TmpDir := InputBox("Локальный путь к ресурсу","Введите путь в формате: <Диск>:\<Путь>",""); //Определяем путь к будующему ресурсу
   if TmpDir = "" then Exit;
   TmpName := InputBox("Сетевое имя","Введите имя",""); //Определяем имя под которым он будет виден в сети
   if TmpName = "" then Exit;
   //преобразуем локальный путь к сетевому
   Path:=TmpDir;
   Path[2]:="$";
   Path:="\\"+Trim(Form1.CompName.Text)+"\"+Path;
   //Проверяем есть ли такая папка если нет, то создаём её
   if not(DirectoryExists(Path)) then
     begin
       MkDir(Path);
       if IOResult<>0 then
         begin
           Application.MessageBox("Не могу создать указанный ресурс!","Создание ресурса",
                             MB_OK+MB_ICONSTOP);
           exit;
         end;
     end;
   HostName := StringToOleStr("\\"+Trim(Form1.CompName.Text));
   TmpNameNT := StringToOleStr(TmpName);
   TmpDirNT := StringToOleStr(TmpDir);
   //Заполняем структуру
   ShareNT.shi2_netname := TmpNameNT; //Имя
   ShareNT.shi2_type := STYPE_DISKTREE; //Тип ресурса
   ShareNT.shi2_remark := ""; //Комментарий
   ShareNT.shi2_permissions := ACCESS_ALL; //Доступ
   ShareNT.shi2_max_uses := DWORD(-1); //Кол-во максим. подключ.
   ShareNT.shi2_current_uses := 0; //Кол-во тек подкл.
   ShareNT.shi2_path := TmpDirNT; //Путь к ресурсу
   ShareNT.shi2_passwd := ""; //Пароль
   try
      if NetShareAdd(PWideChar(HostName), 2, @ShareNT, nil)=0 then btnGetSharesClick(Sender);
   finally
      NetApiBufferFree(@ShareNT);
   end;
 end;


 
MeMO   (2004-09-03 11:42) [19]

Спасибо конечно но это не совсем то что мне надо. Я пытаюсь выкалупать имя шары из той структуры которую заполнила NetShareEnum.


 
Rouse_ ©   (2004-09-03 12:22) [20]

> [19] MeMO   (03.09.04 11:42)
ну так пример же даден как правильно "выколупывать" ;)

см. > [5] Rouse_ ©   (30.08.04 09:23)


 
MeMO   (2004-09-04 16:57) [21]

Rouse_ ©   (03.09.04 12:22) [20]  
не спорю пример правильный, но там ведь нахождение шар. А вот "выколупывать" мне имя надо для NetShareAdd. Так вот в Дмитрий Ботвин   (01.09.04 10:25) [18] это все пальцами делать надо т.е. вводить сетевое имя и т.д.


 
Rouse_ ©   (2004-09-05 11:48) [22]

Ну так а в чем проблема?
NetShareEnum тебе вернула именя ресурсов некоего сетевого компьютера имя которого тебе заранее известно, полное имя строишь так \\имя компьютера\имя ресурса

Или про разные вещи говорим?


 
MeMO   (2004-09-05 12:12) [23]

to Rouse_ ©
я еще из статьи понял как это делается (за неё отдельное спасибо), только в предложенном примере ([18]) данные полученные NetShareEnum не используются, а вписываются в ручную.


 
Rouse_ ©   (2004-09-05 13:37) [24]

Ну тогда имя ресурса (под которым он будет виден в сети) бери от имени папки к которой будет открыт доступ


 
Дмитрий Ботвин   (2004-09-05 15:10) [25]

Если тебе ваще всё лень самому писать тогда запускай комманду:
shrpubw.exe /s <имя компа>, например shrpubw.exe /s server
И за тебя виндус всё сделает :-))))


 
Rouse_ ©   (2004-09-05 18:36) [26]

> [25] Дмитрий Ботвин   (05.09.04 15:10)
Класс, даже не знал что такая утилита есть :)))


 
MeMO   (2004-09-05 22:22) [27]

Помоему это форум по прогаммированию?! Ладно буду ждать обещанной Rouse_ © статью.


 
Rouse_ ©   (2004-09-06 08:58) [28]

А при чем тут статья? В ней не будет этот вопрос рассмотрен...
ЗЫ: Если чесно то я просто не понял какое именно имя ты не можешь найти? Которое в shi1_netname подставляется? Если да, то его туда пожно любое писать, хоть рандомом последовательсость букв сгенерировать...


 
MeMO   (2004-09-06 11:03) [29]

Да имя я уже получается вытянуть из структуры. Просто в примере [5] в конце делается NetApiBufferFree(Info), а я не досмотрел и пытался обратится к Info. Только вот теперь NetShareAdd возвращает постоянно 123 ошибку.

TmpDir:=TShareInfo1Array(@Info^)[lbxShares.ItemIndex].shi1_netname;
TmpName:=InputBox("Share name","Enter name","");
if TmpName="" then Exit;
if TmpDir="" then Exit;
FLibHandle:=LoadLibrary("NETAPI32.DLL");
if FLibHandle=0 then Exit;
@NetShareAdd:=GetProcAddress(FLibHandle,"NetShareAdd");
if not Assigned(NetShareAdd) then begin
MessageDlg("Error in call to Loadlibrary()"+#10+#13+"Error "+IntToStr(Error),mtError,[mbok],0);
FreeLibrary(FLibHandle);
Exit;
end;
ShareNTItem.shi2_netname:=StringToOleStr(TmpName);
ShareNTItem.shi2_type := STYPE_DISKTREE;
ShareNTItem.shi2_remark := "";
ShareNTItem.shi2_permissions := ACCESS_ALL; ShareNTItem.shi2_max_uses := DWORD(-1); ShareNTItem.shi2_current_uses := 0;
ShareNTItem.shi2_path:=StringToOleStr(TmpDir);
ShareNTItem.shi2_passwd :=nil;
Error:=NetShareAdd(Host,2,@ShareNTItem,nil);
if Error<>0 then
MessageDlg("Error in call to NetShareAdd()"+#10+#13+"Error "+Inttostr(Error),mtError,[mbOK],0);
FreeLibrary(FLibHandle);
CompList.OnDblClick(self);

Последний параметр NetShareAdd указывает на ошибку в 8 поле стуктуры. Подскажите может я опять гдето протупил. Спасибо.



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

Форум: "Сети";
Текущий архив: 2004.11.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.034 c
1-1098948958
vvv
2004-10-28 11:35
2004.11.14
тип символа


14-1098902121
reticon
2004-10-27 22:35
2004.11.14
Вопрос по асму...


11-1082719819
BolikDimon
2004-04-23 15:30
2004.11.14
Использование KOL в БД-приложениях


1-1099066921
t0XiC
2004-10-29 20:22
2004.11.14
Использование TStrings


14-1098942290
ИМХО
2004-10-28 09:44
2004.11.14
Рекордная серия Арсенала оборвалась...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский