Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> экспорт класса из dll 
:(
    Опции темы
TaNK
Дата 22.9.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

main.h
Код

#ifndef MAIN_H
#define MAIN_H

//#include <iostream>
#include <windows.h>

using namespace std;

#ifndef CLASS_DLL
#define dll_class _declspec(dllexport)
#else
#define dll_class _declspec(dllimport)
#endif

class dll_class Show
{
  public:
           Show();
           int Print();
  private:
           int i;

};

#endif


main.cpp
Код

#include "main.h"

int Show::Print()
{
  return (i = 100);
}


//===========================================================================

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            break;
    }
    return TRUE; // succesful
}

запустил code::blocks 10.05 и получили dll

не пойму как вызвать из основной проги с помощью LoadLibrary и обраться к функции класса Print();



--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
borisbn
Дата 22.9.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Раз ты экспортируешь класс, то ты должен его импортировать, а LoadLibrary здесь не нужна.
Просто включаешь в основной программе твой main.h, подключаешь lib-файл, полученный при сборке dll-ки и просто используешь класс. типа того:

Код

#include "main.h"
#pragma comment( lib, "main.lib" )
Show showFromDll;
int x = showFromDll.Print();




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TaNK
Дата 22.9.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



borisbn - у меня code::blocks не  создает *.lib а есть что то типа 
libDLL.dll.a
libDLL.dll.def


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
borisbn
Дата 22.9.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А ещё лучше создать интерфейс, наследоваться от него ( реализовать имплементацию ), создать и экспортировать всего одну функцию, создающую имплементацию.
Код

iFace.h:

#pragma pack ( push, 4 )
class IFace {
public:
    virtual __stdcall print() = 0;
    virtual IFace() {}
};
#pragma pack ( pop )

typedef IFace* ( __cdecl *create_t)();

iFaceImpl.h:

#include "iFace.h"
class IFaceImpl : public IFace {
public:
    IFaceImpl(){}
    virtual __stdcall print() { return ( i = 100 ); }
    virtual IFaceImpl() {}
private:
    int i;
};

iFaceImpl.cpp:

#include "iFaceImpl.h"

extern "C" __declspec(dllexport) IFace * __cdecl create() {
return new IFaceImpl();
}

А в основной программе:
Код

#include "iFace.h"
HMODULE module = LoadLibrary( "main.dll" );
create_t create = (create_t)GetProcAddress( module, "create" );
IFace * face = create();
int x = face->print();
delete face;



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TaNK
Дата 22.9.2010, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 virtual IFace() {} - ругается что конструктор не может быть виртуальным...убрать определение virtual?


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
borisbn
Дата 22.9.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



TaNK, пардон. это должен был быть виртуальный деструктор
Код

virtual ~IFace() {}

и то же самое с 
Код

virtual ~IFaceImpl() {}

стучи в жаббер, чтобы не захламлять форум

Это сообщение отредактировал(а) borisbn - 22.9.2010, 14:36


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TaNK
Дата 22.9.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
TaNK
Дата 22.9.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



прошу прощения все получилось....был невнимателен!

Добавлено через 3 минуты и 41 секунду
main.h
Код

#ifndef MAIN_H
#define MAIN_H

//#include <iostream>
#include <windows.h>

using namespace std;

#pragma pack ( push, 4 )
class IFace {
public:
    virtual int __stdcall print() = 0;
    virtual ~IFace() {}
};
#pragma pack ( pop )

typedef IFace* ( __cdecl *create_t)();
#endif


main1.h
Код

#ifndef MAIN1_H_INCLUDED
#define MAIN1_H_INCLUDED

#include "main.h"

class IFaceImpl : public IFace {
public:
    IFaceImpl(){}
    virtual int __stdcall print() { return ( i = 100 ); }
    virtual ~IFaceImpl() {}
private:
    int i;
};

#endif // MAIN1_H_INCLUDED


main.cpp
Код

#include "main1.h"

extern "C" __declspec(dllexport) IFace * __cdecl create()
{
   return new IFaceImpl();
}

BOOL WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void*)
{

    switch( reason )
   {
        case DLL_PROCESS_ATTACH:
           // Initialize once for each new process.
           // Return FALSE to fail DLL load.
           break;

      case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

      case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

      case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}


запускаем main.cpp - получчаем dll

в основной проге 
Код

#include <iostream>
#include "main.h"


using namespace std;



int main()
{


   HMODULE module = LoadLibrary( "dll.dll" );
create_t create = (create_t)GetProcAddress( module, "create" );
IFace * face = create();
int x = face->print();
cout << x;
delete face;

    return 0;
}



borisbn + 1




--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
xvr
Дата 22.9.2010, 15:57 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Поздравляю. До повторного изобретения COM'а остался один шаг (GUID + QueryInterface)
 smile 
PM MAIL   Вверх
borisbn
Дата 22.9.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(xvr @  22.9.2010,  15:57 Найти цитируемый пост)
До повторного изобретения COM'а остался один шаг (GUID + QueryInterface)

 smile 
правда эта конструкция кроссплатформенная, а подсмотрел её я действительно из COM'а, выкинув GUID, QueryInterface и обращение к реестру


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
TaNK
Дата 23.9.2010, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уважаемые, а скажите а зачем делать класс абстрактным? 
и еще пример
class Date(){};

class subdate: public Date
{
   //
}

мне нужен тип Date, но обратиться я не могу т.к. в  Date объвлена чистая виртуальная функуия, как быть в этом случае, какой тип использовать в классе subdate  


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


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


Эксперт
****


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

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




M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI



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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(TaNK @  23.9.2010,  07:54 Найти цитируемый пост)
Уважаемые, а скажите а зачем делать класс абстрактным? 
Что бы наследники не забыли их определить
Отдельно стоит случай абстрактного класса, состоящего ИСКЛЮЧИТЕЛЬНО из чисто виртуальных функций (пример interface'а). Такой класс можно безопасно экспортировать куда угодно, т.к. де факто в нем кроме таблицы виртуальных функций (причем оригинальная VTBL этого класса НИКОГДА не будет использоваться) вообще ничего нет. Никаких функций. Т.е. линкеру не никогда придется линковаться с его функциями (т.к. их нет)

Цитата(TaNK @  23.9.2010,  07:54 Найти цитируемый пост)
мне нужен тип Date, но обратиться я не могу т.к. в  Date объвлена чистая виртуальная функуия, как быть в этом случае, какой тип использовать в классе subdate
Тип тот же (Date), а нужно описать те самые чисто виртуальные функции из Date у себя (в subdate)


PM MAIL   Вверх
TaNK
Дата 23.9.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уважаемые, подскажите пожайлуста почему возникает ошибка

main.h 
Код

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>
#include <ctime>
//#include <iostream>

using namespace std;

//Абстрактный класс, т.к. имеется чисто виртуальная фукнция IsBigDiff
class ABS_date
{
  public:
          enum datesign{dd = 1, mm, yy};
          virtual ~ABS_date(){}; // Конструктор виртуальный
          virtual bool __stdcall IsBigDiff(ABS_date&, int) = 0;     //чисто виртаульная функция
          virtual ABS_date& GetDate() = 0;                //-//-//
         // virtual void __stdcall Viewing() const = 0;               //-//-//
          virtual int datediff(datesign, ABS_date&, ABS_date&) = 0; //-//-//
          virtual bool operator== (const ABS_date&) const = 0;      //-//-//
          virtual bool operator> (const ABS_date&) const = 0;       //-//-//
          virtual bool operator< (const ABS_date&) const = 0;       //-//-//
          virtual bool IsLeapYear(int) = 0;                         //-//-//
          virtual int& MaxDayOfMonth(int&, int&, int&) = 0;         //-//-//
};

typedef ABS_date* (__cdecl *cr_IsBigDiff) ();

//Наследуем от абстрактного класса
class Date : public ABS_date
{
  public:

           enum Month{jan = 1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec,unk};
           Date(int dd = 0, Month mm = Month(0), int year = 0);


           //Деструктор
           virtual ~Date(){};
           //Функции доступа к датам
           int   f_day()const;
           Month f_month()const;
           int   f_year()const;

           //Класс исключений
           /*class Bad_date
           {
            public:
                    Bad_date(short);
                    string& viewing_ex();
            private:
                    string error;
           };*/

           //Функция - модификатор даты
           Date& dateadd (datesign, int, Date&);

           //Проверка высокосного года
           virtual bool IsLeapYear(int);
           //Максимальный день в месяц
           virtual int& MaxDayOfMonth(int&, int&, int&);
           //Перегрузка == для сравнения двух дат
           virtual bool operator== (const Date&) const;
           //Перегрузка > для сравнения двух дат
           virtual bool operator> (const Date&) const;
           //Перегрузка < для сравнения двух дат
           virtual bool operator< (const Date&) const;
           //Функция - разница между двумя датами
           virtual int datediff(datesign, Date&, Date&);
           // Текущая дата
           virtual Date& GetDate();
          // virtual void  __stdcall Viewing()const;
           //True or False если даты сильно отличаются в днях (по умолчанию больше чем на 5 дней)
           virtual bool __stdcall IsBigDiff(ABS_date&, int);

  private:
           int day, year;
           Month month;
           //static ABS_date* default_date; // дата по умолчанию

};

//===============================================================================
//Перегрузка == для сравнения двух дат
bool Date::operator== (const Date& p_date) const
{
  return (this->day == p_date.day && this->month == p_date.month && this->year == p_date.year);
}

//Перегрузка >= для сравнения двух дат
bool Date::operator> (const Date& p_date) const
{
  if   (this->year > p_date.year)
       return true;
  else

  if   (this->year < p_date.year)
       return false;

  if   (this->month > p_date.month)
       return true;
  else

  if   (this->month < p_date.month)
       return false;

  if   (this->day > p_date.day)
       return true;
  else

  if   (this->day < p_date.day)
       return false;
}

//Перегрузка <= для сравнения двух дат
bool Date::operator< (const Date& p_date) const
{
  if   (this->year < p_date.year)
       return true;
  else

  if   (this->year > p_date.year)
       return false;

  if   (this->month < p_date.month)
       return true;
  else

  if   (this->month > p_date.month)
       return false;

  if   (this->day < p_date.day)
       return true;
  else

  if   (this->day > p_date.day)
       return false;
}

//Проверка на високосный год
bool Date::IsLeapYear(int yy)
{
    if ((yy%4 == 0 && yy%100 != 0) || yy%400 == 0)
       return true;
    else
        return false;
}

//Максимальный день в месяце
int& Date::MaxDayOfMonth(int& ref_temp_mm, int& ref_max_date, int& ref_year)
{
   switch (ref_temp_mm)
   {
     case 2:
            ref_max_date = 28 + Date::IsLeapYear(ref_year);
     break;

     case 4: case 6: case 9: case 11: ref_max_date = 30;
     break;

     case 1: case 3: case 5: case 7: case 8: case 10: case 12: ref_max_date = 31;
     break;
   }

   return ref_max_date;

}

/*
void  Date::Viewing()const
{
    cout << day << "-" << month <<  "-" << year;
}*/

//Текущая дата
Date& Date::GetDate()
{
  time_t t;
  tm* tm_t;
  time(&t);

  tm_t = localtime(&t);

  year  = (tm_t->tm_year + 1900);
  month = Month(tm_t->tm_mon + 1);
  day   = tm_t->tm_mday;

  return *this;
}
//===========================__stdcall===========================================
bool Date::IsBigDiff(ABS_date& date_isbig, int value = 5)
{

   ABS_date* g_date;
    g_date->GetDate(); // Дата по умолчанию

    if   (g_date->datediff(ABS_date::dd, date_isbig, *g_date) <= value)
         return false;
    else
         return true;

    delete g_date; // Очищаем выделенную память под Дату по умолчанию
}

//Функция - разница между двумя датами
int Date::datediff(datesign sign, Date& date_first, Date& date_second)
{
    if (date_first == date_second) // Даты идентичны
       return 0;
    else

    switch(sign)
   {
       case yy: //Год между двумя датами
                {
                  int yy_f = date_first.year, yy_s = date_second.year;
                  return (yy_s - yy_f);

                } break;

       case mm: // Месяц между двумя датами
                {
                  int mm_f = date_first.month,  yy_f = date_first.year,
                      mm_s = date_second.month, yy_s = date_second.year,
                      count_mm = 0;

                  if (date_second > date_first) // Вторая дата больше первой
                  {

                    while (yy_s != yy_f || mm_s != mm_f)
                    {
                       // Одинаковые года
                       if (yy_s == yy_f)
                           {
                             count_mm += mm_s - mm_f;
                             mm_s     -= mm_s - mm_f;
                           }
                       else
                            {
                              // Когда года у дат разные
                              yy_s--;
                              count_mm += mm_s;
                              mm_s = 12;
                            }
                    }
                    return count_mm;
                  }
                  else
                      if (date_second < date_first) // Вторая дата меньше первой
                      {
                        while (yy_f != yy_s || mm_f != mm_s)
                        {
                          // Одинаковые года
                          if (yy_f == yy_s)
                             {
                               count_mm += mm_f - mm_s;
                               mm_f     -= mm_f - mm_s;
                             }
                         else
                              {
                                // Когда года у дат разные
                                yy_f--;
                                count_mm += mm_f;
                                mm_f = 12;
                              }
                        }
                        return -count_mm;
                    }

                } break;

       case dd: // День между двумя датами
               {
                  int day_f = date_first.day,  mm_f = date_first.month,  yy_f = date_first.year,
                      day_s = date_second.day, mm_s = date_second.month, yy_s = date_second.year,
                      count_dd = 0;

                  if (date_second > date_first) // Вторая дата больше первой
                  {
                     while (yy_s != yy_f || mm_s != mm_f || day_s != day_f) // Пока даты неравны
                     {
                        // Месяцы и года у дат одинаковые
                        if (mm_s == mm_f && yy_s == yy_f)
                        {
                            count_dd += day_s - day_f;
                            day_s    -= day_s - day_f;

                        }
                        else
                        {
                            count_dd += day_s;
                            mm_s--;

                            if (0 == mm_s)
                            {
                               mm_s = 12;
                               yy_s--;
                            }
                            //Находим Max день в месяце
                            Date::MaxDayOfMonth(mm_s, day_s,yy_s);
                        }
                     }
                 }
                 else
                 if (date_second < date_first) // Вторая дата меньше первой
                 {
                     while (yy_f != yy_s || mm_f != mm_s || day_f != day_s) // Пока даты неравны
                     {
                        // Месяцы и года у дат одинаковые
                        if (mm_f == mm_s && yy_f == yy_s)
                        {
                            count_dd = (day_s - day_f) - count_dd;
                            day_f   -= day_f - day_s;

                        }
                        else
                        {
                            count_dd += day_f;
                            mm_f--;

                            if (0 == mm_f)
                            {
                               mm_f = 12;
                               yy_f--;
                            }
                            //Находим Max день в месяце
                            Date::MaxDayOfMonth(mm_f, day_f,yy_f);
                        }
                     }
                 }

               return count_dd;

               }break;

     //default: throw Bad_date(4);
   }
}

//================================================================================

#endif // __MAIN_H__


кажется в абстрактном классе портит вот это объявление
Код

enum datesign{dd = 1, mm, yy};


экспортироваться будет 
Код

virtual bool __stdcall IsBigDiff(ABS_date&, int) = 0;


все остальное запихнул  в АБС так как IsBigDiff ипользует в той или иной мере

main.cpp
Код

#include "main.h"


extern "C" __declspec(dllexport) ABS_date * __cdecl IsBigDiff()
{
   return new Date();
}


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
   return TRUE; // succesful
}


ругает меня компил на строку 

 return new Date();
и пишет  cannot allocate an object of abstract type 'Date'   because the following virtual functions are pure within 'Date': 
virtual int ABS_date::datediff(ABS_date::datesign, ABS_date&, ABS_date&)| и пречисляет все мои вирт функции, как исправить...подскажите..пожайлуста


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
xvr
Дата 23.9.2010, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Компилятор совершенно правильно ругается, разницу между
Код

int datediff(datesign, ABS_date&, ABS_date&)
и
int datediff(datesign, Date&, Date&);
видите? Подсказка - типы параметров должны совпадать
Код

bool Date::IsBigDiff(ABS_date& date_isbig, int value = 5)
{
   ABS_date* g_date;
    g_date->GetDate(); // Дата по умолчанию
    if   (g_date->datediff(ABS_date::dd, date_isbig, *g_date) <= value)
         return false;
    else
         return true;
    delete g_date; // Очищаем выделенную память под Дату по умолчанию
}
А где создание объекта для g_date ?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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