Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дочернее окно в другом приложении, WinAPI 
:(
    Опции темы
Qwe2
Дата 19.4.2012, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть приложение, к нему можно подключать сторонние dll. Я создал такую dll и в ней сделал модальное диалоговое окна с помощью DialogBox. Все работает. А можно таким же образом создать немодальное окно: чтобы оно висело (хочу поместить туда некий текст с картинкой), а программа дальше бы работала. Просто DialogBox как ему и положено блокирует работу приложения до закрытия диалога...
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Qwe2 @  19.4.2012,  14:46 Найти цитируемый пост)
А можно таким же образом создать немодальное окно: чтобы оно висело (хочу поместить туда некий текст с картинкой), а программа дальше бы работала. 

если код DLL вызывается в основном потоке приложения (в общем случае - в GUI потоке), то конечно можно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А каким образом? Я делал так (см. ниже), но окно либо все такое же модальное (блокирующее основное приложение), либо, если я указывал стиль WS_CHILD - то поведение его становится все равно не правильным...

Код

#include <windows.h>

HINSTANCE hInstance;

LRESULT CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

//
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD, LPVOID)
{
    hInstance = hInst;
    return TRUE;
}

//
extern "C" __declspec(dllexport) int FuncMy(HWND hWnd, LPCSTR sMess)
{ 
    HWND hWndD = CreateDialog(hInstance, "TMP", hWnd, (DLGPROC)DlgProc);
    //SetWindowLong(hWndD, GWL_EXSTYLE, GetWindowLong(hWndD, GWL_EXSTYLE) | WS_EX_NOPARENTNOTIFY);

    if(!hWndD)
        return 1;

    ShowWindow(hWndD, SW_SHOW);
    UpdateWindow(hWndD);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        if(!IsDialogMessage(hWndD,&msg))
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }
    return msg.wParam; 
}

//
LRESULT CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_INITDIALOG:
        return TRUE;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        }
    break;

    case WM_CLOSE:
        DestroyWindow(hWnd);
    PostQuitMessage(0);
    return TRUE;
    }
    return FALSE;
}

PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



а цикл здесь не нужен, он уже есть в exe


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
feodorv
Дата 19.4.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Qwe2 @  19.4.2012,  14:23 Найти цитируемый пост)
 HWND hWndD = CreateDialog(hInstance, "TMP", hWnd, (DLGPROC)DlgProc);

Ну так если указывать владельца диалога (hWnd), то блокировка будет.
Если не указывать (NULL), то не будет:
Код

HWND hWndD = CreateDialog(hInstance, "TMP", NULL, (DLGPROC)DlgProc);

Ну, правда при этом придётся в цикле сообщений делать проверку на IsWindow(hWndD) && IsDialogMessage( hWndD, &msg) и на IsWindow(hWnd) && IsDialogMessage( hWnd, &msg)...

Это сообщение отредактировал(а) feodorv - 19.4.2012, 14:03


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Qwe2
Дата 19.4.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цикл сообщений нужен или нет? Стиль WS_CHILD?

Это сообщение отредактировал(а) Qwe2 - 19.4.2012, 14:24
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(feodorv @  19.4.2012,  16:01 Найти цитируемый пост)
Ну так если указывать владельца диалога (hWnd), то блокировка будет.Если не указывать (NULL), то не будет

CreateDialog просто создает окно диалога, без каких-либо блокировок

Добавлено через 4 минуты и 31 секунду
Цитата(Qwe2 @  19.4.2012,  16:12 Найти цитируемый пост)
Цикл сообщений нужен или нет? Стиль WS_CHILD?

нет


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Когда я убрал цикл сообщений в dll, то окно появилось как немодальное (можно тыкать в меню и т.д.) и все вроде бы ок, но при щелчке на заголовок (даже при наведении на заголовок) или при клике на кнопку exe вылетает с ошибкой...
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Qwe2 @ 19.4.2012,  16:25)
Когда я убрал цикл сообщений в dll, то окно появилось как немодальное (можно тыкать в меню и т.д.) и все вроде бы ок, но при щелчке на заголовок (даже при наведении на заголовок) или при клике на кнопку exe вылетает с ошибкой...

по всей видимости, в exe используется какая-то объектная оболочка, которая извлекает объект по дескриптору окна, и нет проверки на то, что дескриптор может не поддерживать такой объект, вот и вылетает

т.е. надо править exe (поставить такую проверку), либо использовать ту же оболочку в dll, что используется в exe,
иначе внедрить немодальное окно будет невозможно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А можно с помощью hook'а решить это (править exe нет возможности)?
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Qwe2 @ 19.4.2012,  16:48)
А можно с помощью hook'а решить это (править exe нет возможности)?

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

думаю, если софт достаточно новый, проще связаться с разработчиками и попросить их внести коррективы, раз уж они дают возможность подключать библиотеки (вполне возможно, что именно немодальное окно в сторонней dll они просто не тестировали)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо.
А как частный случай задачи - можно вместо окна (с текстом и картинокй) выводить всплывающую подсказку (то есть теперь в dll будет что-то типа
Код

CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, <...>

Нашел как подобное можно сделать в общем случае: по событию от мышки когда курсор наводится на кнопку всплывает подсказка. А можно эту подсказу вывести для exe - она бы появилась на несколько секунд и исчезла, а пользователь в это время продолжает работать?
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



попробовать конечно можно: сабклассить основное окно и перехватить нужные события, задействовав, например TrackMouseEvent,

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

для начала просто подсказку отобразить в произвольном месте окна

Вот это и нужно в принципе. Пробую, пока подсказки не вижу, хотя и ошибок тоже нет... Может быть из-за того, что после создания подсказки я сразу же выхожу из функции, которая вызывается из dll (FuncMy())?
PM MAIL   Вверх
feodorv
Дата 19.4.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(GremlinProg @  19.4.2012,  15:12 Найти цитируемый пост)
CreateDialog просто создает окно диалога, без каких-либо блокировок

Хорошо.

...

Это сообщение отредактировал(а) feodorv - 19.4.2012, 19:23


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GremlinProg
Дата 19.4.2012, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Qwe2 @  19.4.2012,  17:40 Найти цитируемый пост)
Может быть из-за того, что после создания подсказки я сразу же выхожу из функции, которая вызывается из dll (FuncMy())?

нет, скорее всего из-за того, что не вызываешь InitCommonControls


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 19.4.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот код, почему не работает не знаю... Я так понял, что этим мы говорим системе, что при наведении мышки на элемент с указанным хэндлом надо показывать подсказку. А можно ее просто вывести один раз на заданное число секунд и все, потом она уже не нужна...
Код

#include <windows.h>
#include <commctrl.h>
#pragma comment (lib, "comctl32.lib")

HINSTANCE hInstance;
void CreateHint(HWND, LPSTR);

//
BOOL WINAPI DllMain(HINSTANCE hInst, DWORD, LPVOID)
{
    hInstance = hInst;
    return 1;
}

//
extern "C" __declspec(dllexport) int FuncMy(HWND hWnd, LPCSTR sMess)
{ 
    CreateHint(hWnd,"Bla-bla-bla...");
    return 0;
}

//
void CreateHint(HWND hwnd,char* strTT)
{
    HWND hwndTT;
    TOOLINFO ti;
    unsigned int uid = 0;
    RECT rect;
    InitCommonControls();    
    hwndTT = CreateWindowEx(WS_EX_TOPMOST,TOOLTIPS_CLASS,
        NULL,WS_POPUP | TTS_ALWAYSTIP,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        hwnd,NULL,hInstance,NULL);
     SetWindowPos(hwndTT,HWND_TOPMOST,0,0,0,0,
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
    GetClientRect (hwnd, &rect);
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_SUBCLASS;
    ti.hwnd = hwnd;
    ti.hinst = hInstance;
    ti.uId = uid;
    ti.lpszText = strTT;
    ti.rect.left = rect.left;    
    ti.rect.top = rect.top;
    ti.rect.right = rect.right;
    ti.rect.bottom = rect.bottom;
    SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); 
 }


PM MAIL   Вверх
feodorv
Дата 19.4.2012, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Qwe2 @  19.4.2012,  17:20 Найти цитируемый пост)
InitCommonControls(); 


Код

 INITCOMMONCONTROLSEX ic;

  ZeroMemory( &ic, sizeof(INITCOMMONCONTROLSEX));
  ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
  ic.dwICC = ICC_WIN95_CLASSES | ICC_BAR_CLASSES ;
  InitCommonControlsEx( &ic );

???


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Qwe2
Дата 19.4.2012, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проверяю по отладчику - все вроде ок, хэндлы не нулевые, структуры заполняются, но всплывающей подсказки не вижу...
PM MAIL   Вверх
GremlinProg
Дата 20.4.2012, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



а посмотри ву Spy, кто такой hWnd из FuncMy, где его координаты и видим ли он вообще )


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 20.4.2012, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добавил точно видимый хэндл, где tooltip? ) Когда к EditBox'у или кнопке подводишь мышь она всплывает (привычное поведение), а что мы сейчас пытаемся сделать? Она должна всплыть прямо в окне? При наведении мыши или?
Код

hWnd = FindWindow(NULL, "Калькулятор");

PM MAIL   Вверх
GremlinProg
Дата 20.4.2012, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Qwe2 @  19.4.2012,  18:20 Найти цитируемый пост)
Вот код, почему не работает не знаю... Я так понял, что этим мы говорим системе, что при наведении мышки на элемент с указанным хэндлом надо показывать подсказку. 

пока мы можем только гадать, что это за приложение,
подозреваю, что FuncMy вызывается, когда основное окно еще не видимо, т.е. без его сабклассинга будет проблематично что-либо сделать

подмени процедуру окна, поймай что-нить на WM_NCHITTEST, например:
Код

...
case WM_NCHITTEST:
  Result = RealWndProc( hwnd, uMsg, wParam, lParam );
  if( Result == HTCAPTION ){
    static BOOL Once = TRUE;
    if( Once ){
      Once = FALSE;
      CreateHint( ... );
    }
  }
  return Result;
...



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 20.4.2012, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Цитата(Qwe2 @ 19.4.2012,  12:46)
Есть приложение, к нему можно подключать сторонние dll. Я создал такую dll и в ней сделал модальное диалоговое окна с помощью DialogBox. Все работает. А можно таким же образом создать немодальное окно: чтобы оно висело (хочу поместить туда некий текст с картинкой), а программа дальше бы работала. Просто DialogBox как ему и положено блокирует работу приложения до закрытия диалога...

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


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 20.4.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Dem_max @  20.4.2012,  15:14 Найти цитируемый пост)
С диалогом такого не сделаешь, но вот с обычным окном без проблем, будет отображаться параллельно с главным окном.

диалог - это обычное окно  smile 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 20.4.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



хотя да, ошибся, нужно только создать дополнительный поток и туда переместить весь код с выборкой сообщений.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 20.4.2012, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Dem_max @  20.4.2012,  15:43 Найти цитируемый пост)
хотя да, ошибся, нужно только создать дополнительный поток и туда переместить весь код с выборкой сообщений.

ага, можно и так


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Qwe2
Дата 23.4.2012, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

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

Так как это будет выглядеть? Поток создавать CreateThread в FuncMy() и как узнать его завершения?

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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