Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> hook ошибка доступа к памяти, hook ошибка доступа к памяти 
:(
    Опции темы
artemxxl
Дата 24.5.2012, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.5.2010

Репутация: нет
Всего: нет



Доброго времени суток.
Есть dll в которой я ставлю хук на клавиатуру и в этой же dll есть форма.
в функции хука проверяется нажатая клавиша и если нажата нужная, то мы либо показываем либо скрываем форму.
Показ формы проходит успешно всегда а вот при ее скрытии возникает ошибка 
Exception EAccessViolation in module lib2.dll at FF63F386.
AccessViolation at address FF640386. Read of address FF640386

причем иногда она не возникает а иногда возникает.
И еще заметил одну вешь. Если я цепляю dll к блокноту, то ошибка не возникает вообще. А если например к тотал командер или L2.exe то возникает.
Приведу ниже код:

dll:
Код

library lib2;


uses
  windows,
 // messages,
  forms,
 // classes,
  sysutils,
 // shellapi,
 // inifiles,
 // registry,
  main in 'main.pas' {Form2};
const
  MMFName: PChar = 'MyMMF'; // èìÿ îáúåêòà ôàéëîâîãî îòîáðàæåíèÿ

{ñòðóêòóðà, ïîëÿ êîòîðîé áóäóò îòîáðàæåíû â ôàéë ïîäêà÷êè}
type
  PGlobalDLLData = ^TGlobalDLLData;
  TGlobalDLLData = packed record
  theHook : THandle;
  theHook2 : THandle;
  appHandle:hwnd;
  //  SysHook: HWND; // äåñêðèïòîð óñòàíîâëåííîé ëîâóøêè
  end;

var
//  theHook : THandle;
//  theHook2 : THandle;
//  appHandle:hwnd;
  GlobalData: PGlobalDLLData;
  MMFHandle: THandle;
  lk:HWND;
pt : TPoint;
//theHook : THandle;
visibled,gvisibled:boolean;
game_handle, gmWindow,botWindow:hwnd;
bot_handle:hwnd = 0;
//list: tstringlist;
this_pr,this_pk:word;
//ggg:string;
f:textfile;


function GetProcessId(hp: HWND): DWORD; stdcall; external 'Kernel32.dll';


function ProcCloseEnum2(hwnd:THandle;data:pointer):BOOL;stdcall;
var
pid:DWORD;
f:textfile;
a:pchar;
  aName: array[0..255] of Char;
begin
 Result:=true;
 GetWindowThreadProcessId(hwnd,pid);
 if pid=DWORD(data) then
  begin
  GetClassName(hwnd, aName, SizeOf(aName)); // Handle ìîæíî óçíàòü ÷åðåç FindWindow è áåç èìåíè êëàññà...
    if aName='TForm2' then
    if botWindow=0 then botWindow:=hwnd;
if aName='TForm2' then begin
if IsWindowVisible(hwnd)=true then  begin
ShowWindow(botWindow,SW_HIDE);
end else begin
ShowWindow(botWindow,SW_SHOW);
end;
//pr:=24;
end;
end;
end;



procedure BotShowing(pr:word; hp: word);
begin
EnumWindows(@ProcCloseEnum2,GetProcessId(hp));
end;




function getVisible:boolean;
begin
Result:=gvisibled;
end;

procedure setVisible;
begin
if gvisibled=false then gvisibled:=true else gvisibled:=false;
end;

//////////////////////////////
procedure OpenGlobalData();
begin
  {ïîëó÷àåì îáúåêò ôàéëîâîãî îòîáðàæåíèÿ}
//  MMFHandle:= CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); // ìîæíî òàê, íî ëó÷øå: ñì. ñëåä. ñòðîêó
  MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
  if MMFHandle = 0 then
    MessageBox(0, 'Can''t create FileMapping', 'Message from Exampel2/Process1', 0);
  {îòîáðàæàåì ãëîáàëüíûå äàííûå íà ÀÏ âûçûâàþùåãî ïðîöåññà è ïîëó÷àåì óêàçàòåëü
   íà íà÷àëî âûäåëåííîãî ïðîñòðàíñòâà}
  GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
  if GlobalData = nil then
    begin
      CloseHandle(MMFHandle);
      MessageBox(0, 'Can''t make MapViewOfFile', 'Message from Exampel2/Process1', 0);
    end;
end;

procedure CloseGlobalData();
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MMFHandle);
end;
/////////////////////////////

function KeyHook(nCODE, WParam, LParam: DWORD): DWORD; stdcall;
var
  ServerWnd: THandle;
  ScanCode:integer;
 // ini:TIniFile;
 s2:integer;
 path:string;
// reg:tregistry;
 wnd:word;
 hhh:LongBool;
 hProc:hwnd;
 prId:dword;
 hInst:Cardinal;
 hwnd:word;
begin
if nCode<0 then begin
result := CallNextHookEx(GlobalData^.theHook, nCode, wParam, lParam);
exit;
end;
   if nCODE = HC_ACTION then begin //0
   if ((LParam or (1 shl 30))=LParam) then
    begin //1
    ScanCode:=(LParam shr 16)and $FF;
    if ScanCode=71 then begin //2
    try
    if (IsWindowVisible(form2.Handle)=true) and (visibled=false) then visibled:=true;
    if (IsWindowVisible(form2.Handle)=false) and (visibled=true) then visibled:=false;
    except end;
    if visibled=false then begin //3
      try
      ShowWindow(form2.Handle,SW_SHOW);
      form2.Visible:=true;
      except
    lk:=GetActiveWindow;
    Application.CreateForm(tform2,form2);
      form2.Visible:=true;
      form2.Caption:=inttostr(GetWindowThreadProcessId(lk));
      form2.Tag:=lk;
      end;
    visibled:=true;
          end else begin //3

         // form2.Visible:=false;
          ShowWindow(form2.Handle,SW_HIDE);
          visibled:=false;
                    end; //3
     end; //2
    end;//1
      end;//0
 // messageBox(0,pchar(inttostr(nCode)),'go!',mb_ok);
  result := CallNextHookEx(GlobalData^.theHook, nCode, wParam, lParam);

  //sleep(10);
 end;

function ProcCloseEnum(hwnd:THandle;data:pointer):BOOL;stdcall;
var
pid:DWORD;
f:textfile;
a:pchar;
  aName: array[0..255] of Char;
begin
 Result:=true;
 GetWindowThreadProcessId(hwnd,pid);
 if pid=DWORD(data) then
  begin

if (IsWindowVisible(hwnd)=true)  then begin
  GetClassName(hwnd, aName, SizeOf(aName)); // Handle ìîæíî óçíàòü ÷åðåç FindWindow è áåç èìåíè êëàññà...
    if aName<>'TForm2' then
    if gmWindow=0 then gmWindow:=hwnd;
end;

if gvisibled=false then
ShowWindow(gmWindow,SW_HIDE) else ShowWindow(gmWindow,SW_SHOW);

end;
end;

procedure show_hide_gw(pr:word; hp: word);
begin
EnumWindows(@ProcCloseEnum,GetProcessId(hp));
if gvisibled=false then gvisibled:=true else gvisibled:=false;
end;


procedure Start(threadId:word;handle:hwnd;handle2:hwnd);
begin
this_pr:=threadId;
this_pk:=handle;
pr:=threadId;
pk:=handle;
game_handle:=handle;
//GlobalData^.theHook2 := SetWindowsHookEx(WH_SHELL, @ShellHook, HInstance, threadId);
GlobalData^.theHook := SetWindowsHookEx(WH_KEYBOARD, @keyHook, HInstance, threadId);

if GlobalData^.theHook = 0 then messageBox(0,'Error!','Error!',mb_ok);
gmWindow:=0;
 GlobalData^.appHandle:=threadId;
end;


procedure Remove;
begin
messageBox(0,'unhook!','unhook!',mb_ok);
UnhookWindowsHookEx(GlobalData^.theHook);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH: begin OpenGlobalData;
    end;
    DLL_PROCESS_DETACH: CloseGlobalData;
  end;
end;


exports
Start index 1 name 'Start',
Remove index 2 name 'Remove',
getVisible index 3 name 'getVisible',
setVisible index 4 name 'setVisible',
BotShowing index 5 name 'BotShowing',
show_hide_gw index 6 name 'show_hide_gw';
begin
//MessageBox(0, PChar(Application.ExeName), 'Message from Exampel1/Process1', 0);
  {íàçíà÷èì ïîöåäóðó ïåðåìåííîé DLLProc}
  DLLProc:= @DLLEntryPoint;
  {âûçûâàåì íàçíà÷åííóþ ïðîöåäóðó äëÿ îòðàæåíèÿ ôàêòà ïðèñîåäèíåíèÿ äàííîé
   áèáëèîòåêè ê ïðîöåññó}
  DLLEntryPoint(DLL_PROCESS_ATTACH);


end.


Форма в dll:
Код

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, Mask, bsSkinBoxCtrls, bsSkinCtrls,
  Buttons;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    ListBox1: TListBox;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    other_ctrl: TPanel;
    GroupBox1: TGroupBox;
    TrackBar1: TTrackBar;
    GroupBox2: TGroupBox;
    SpeedButton1: TSpeedButton;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    GroupBox5: TGroupBox;
    GroupBox6: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton2: TSpeedButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    SpeedButton3: TSpeedButton;
    Memo1: TMemo;
    SpeedButton4: TSpeedButton;
    SpeedButton6: TSpeedButton;
    CheckBox1: TCheckBox;
    SpeedButton5: TSpeedButton;
    procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure ListBox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  procedure show_hide_gw(pr:word; hp: word); external 'lib2.dll' name 'show_hide_gw';
  function getVisible:boolean;external 'lib2.dll' name 'getVisible';
  procedure setVisible;external 'lib2.dll' name 'setVisible';
var
  Form2: TForm2;
  pr,pk:word;
implementation

{$R *.dfm}


procedure CenterText(Cnv: TCanvas; Rect: TRect; S: string);
 var
    X, Y: Integer;
 begin
   X := (Rect.Right + Rect.Left - Cnv.TextWidth(S)) div 2;
   Y := (Rect.Bottom + Rect.Top - Cnv.TextHeight(S)) div 2;
   Cnv.TextOut(X, Y, S);
 end;

procedure TForm2.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var s, s1, s2: string;
bitmap:TBitmap;
i: integer;
H: HDC;
align:cardinal;
begin
s:=TListBox(Control).Items[Index];
TListBox(Control).Canvas.FillRect(Rect);
//ShowMessage(s);
if Index in [0,6,12,18,26,30] then align:=DT_CENTER ELSE
align:=DT_LEFT;
if Index in [0,6,12,18,26,30] then begin
 TListBox(Control).Canvas.Font.Style:=[fsBold,fsbold,fsbold,fsbold];
 ListBox1.Canvas.Brush.Style:=bsClear;
 Bitmap := Image1.Picture.Bitmap;
      ListBox1.Canvas.BrushCopy(Bounds(Rect.Left,Rect.Top,
       Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width,
       Bitmap.Height), clRed);
 end;
 h:=TListBox(Control).Canvas.Handle;
if Index in [0,6,12,18,26,30] then  CenterText(ListBox1.Canvas,rect,s) else
DrawText(H, PChar(s), Length(s), Rect, align or DT_VCENTER);

//TListBox(Control).Canvas.Brush.Style:=bsVertical;
//DrawText(H, PChar(s), Length(s), Rect, align or DT_VCENTER);
end;

procedure TForm2.ListBox1Click(Sender: TObject);
var Caption_:string;
begin
if ListBox1.ItemIndex in [0,6,12,18,26,30] then ListBox1.ItemIndex:=ListBox1.ItemIndex+1;
Caption_:='    '+ListBox1.Items.Strings[ListBox1.itemindex];
Image2.Canvas.FillRect(Image2.ClientRect);
Image2.Canvas.Brush.Style:=bsClear;
Image2.Canvas.BrushCopy(Bounds(0,0,image3.Width, Image3.Height), Image3.Picture.Bitmap, Bounds(0, 0, Image2.Width,
       image2.Height), clRed);;
Image2.Canvas.Font.Size:=10;
Image2.Canvas.Font.Style:=[fsBold,fsBold,fsBold,fsBold];
Image2.Canvas.TextOut(0,8,Caption_);
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
//ShowWindow(Form2.Handle, sw_Hide);
ListBox1.ItemIndex:=1;
ListBox1.OnClick(nil);
SetWindowLong(Application.Handle, GWL_EXSTYLE, NOT WS_EX_APPWINDOW);
end;

procedure TForm2.TrackBar1Change(Sender: TObject);
begin
form2.AlphaBlendValue:=TrackBar1.Position;
end;

procedure TForm2.SpeedButton1Click(Sender: TObject);
var r:boolean;
begin
//ShowMessage(inttostr(pr));
//show_hide_gw(strtoint(form2.Caption),form2.Tag);
r:=getVisible;
//ShowMessage(vartostr(r));
if r=false then
ShowWindow(form2.Tag,SW_HIDE) else
ShowWindow(form2.Tag,SW_SHOW);
setvisible;
end;

end.


Программа подгрузчик dll:
Код

unit starter;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ImgList, Buttons, TrayIcon, Menus,inifiles,shellapi,
  jpeg,registry;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Edit1: TEdit;
    Label1: TLabel;
    SpeedButton1: TSpeedButton;
    ImageList1: TImageList;
    Label2: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    TrayIcon1: TTrayIcon;
    PopupMenu1: TPopupMenu;
    RunGame1: TMenuItem;
    ShowHide1: TMenuItem;
    Exit1: TMenuItem;
    OpenDialog1: TOpenDialog;
    Image1: TImage;
    PopupMenu2: TPopupMenu;
    ShowHideGamewindow1: TMenuItem;
    ShowHideWalkerwindow1: TMenuItem;
    ExitGameandWalker1: TMenuItem;
    Timer1: TTimer;
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure TrayIcon1DblClick(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure ShowHide1Click(Sender: TObject);
    procedure TrayIcon1Click(Sender: TObject);
    procedure RunGame1Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure ExitGameandWalker1Click(Sender: TObject);
    procedure ShowHideWalkerwindow1Click(Sender: TObject);
    procedure ShowHideGamewindow1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
   procedure Start(threadId:word;handle:hwnd;self:hwnd); external 'lib2.dll' name 'Start';
   procedure Remove; external 'lib2.dll' name 'Remove';
   procedure show_hide_gw(pr:word; hp: word); external 'lib2.dll' name 'show_hide_gw';
   procedure destroy_all; external 'lib2.dll' name 'destroy_all';
    procedure BotShowing(pr:word; hp: word); external 'lib2.dll' name 'BotShowing';
var
  Form1: TForm1;
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  pr,pk:variant;
  inGame:boolean;
implementation

{$R *.dfm}
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var nCode, ctrlID : word;
Begin
case msg of
wm_destroy :
Begin
Remove;//óäàëÿåì ÍÎÎÊ
postquitmessage(0); exit;
Result:=0;
End;

else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;



procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
Form1.Visible:=false;
end;

procedure TForm1.TrayIcon1DblClick(Sender: TObject);
begin
if inGame=false then
Form1.Show else
//ShowMessage(inttostr(pk));
show_hide_gw(pr,pk);
end;

procedure TForm1.Exit1Click(Sender: TObject);
begin
form1.close;
end;

procedure TForm1.ShowHide1Click(Sender: TObject);
begin
if form1.Visible=true then form1.Visible:=false else form1.Visible:=true;
end;

procedure TForm1.TrayIcon1Click(Sender: TObject);
begin
if inGame=false then
PopupMenu1.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y) else
PopupMenu2.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
end;

procedure TForm1.RunGame1Click(Sender: TObject);
begin
SpeedButton4.Click;
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
var wc : TWndClassEx;
MainWnd: THandle;
Mesg : TMsg;
lk:hwnd;
begin
inGame:=true;
TrayIcon1.PopupMenu:=PopupMenu2;
form1.PopupMenu:=PopupMenu2;
form1.Visible:=false;
CreateProcess(nil, 'c:\program files\total commander\totalcmd.exe', nil, nil, False, 0,
                nil, nil, StartInfo, ProcInfo);
   pr:=ProcInfo.dwThreadId;
   pk:=ProcInfo.hProcess;
   Timer1.Enabled:=true;
   sleep(1000);

Start(pr,pk,Application.Handle);//âñòàâëÿåì ÍÎÎÊ

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then Edit1.Text:=OpenDialog1.FileName;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var ini:TIniFile;
begin
ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'set.ini');
ini.WriteString('PATH','L2_PATH',Edit1.Text);
ini.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
var ini:TIniFile;
reg:TRegistry;
begin
Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Software', True) then begin
     // for i:=1 to 4 do buf[i]:=0;
     // buf[0]:=1;
     reg.WriteString('xxlPath',ExtractFilePath(Application.ExeName));
     // Reg.WriteBinaryData('Value', buf, sizeof(buf));
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
    inherited;
  end;

ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'set.ini');
Edit1.Text:=ini.ReadString('PATH','L2_PATH','');
ini.Free;
inGame:=false;
end;

procedure TForm1.ExitGameandWalker1Click(Sender: TObject);
begin
//destroy_all;
//ExitProcess(pk);
TerminateProcess(pk,0);
Close;
end;

procedure TForm1.ShowHideWalkerwindow1Click(Sender: TObject);
begin
BotShowing(pr,pk);
//SetVisible2;
//show_hide_gw;
end;

procedure TForm1.ShowHideGamewindow1Click(Sender: TObject);
begin
show_hide_gw(pr, pk);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var exitCode:cardinal;
begin
GetExitCodeProcess(pk, ExitCode);
if ExitCode<>STILL_ACTIVE then begin
Remove;
close;
end;
end;

end.


На всякий случай прикладываю исходники полностью.


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  XXL2Walker.zip 131,50 Kb
PM MAIL   Вверх
MetalFan
Дата 24.5.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



artemxxl, ужас какой. Мало того, что форма в dll, так еще и dll внедряемая...
Может обойтись без dll? Воспользоваться хуком WH_KEYBOARD_LL, который прекрасно работает и без dll.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
artemxxl
Дата 25.5.2012, 06:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.5.2010

Репутация: нет
Всего: нет



нельзя без внедрения. далее на основе настроек в этой самой форме будут генерироваться сетевые пакеты и отправляться от имени кокретного экземпляра приложения в который внедряется длл. Ведь чтобы перехватывать вызовы приложением таких API функция как send, recv, WSASend, WSARecv внедрение в процесс просто необходимо.

Добавлено через 12 минут и 54 секунды
и еще вопрос по моему же коду. Как правильно unHook сделать на момент уничожения процесса в который длл внедряется. А то в таком варианте как сейчас при закрытии приложения с внедренной Длл вылетает та же ошибка доступа к памяти.
Может копать в сторону (SetWindowsHookEx(WH_SHELL....", но в функции фильтре как отловить закрытие именно основного окна а скажем не моей же встроенной формы?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.