Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Открыть новую тему     Написать ответ в эту тему

V1s1ter



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
         
Обсуждаем новые возможности и баги
 
Просьба писать про Embarcadero RAD Studio XE5, XE6, XE7, XE8, 10.x (Seattle, Berlin,Tokyo)
  По вопросам скачивания - Тема в Варезнике (lite-версии тут)
  Вопросы по неюникодным версиям Delphi — шестая бумага
  Бесплатные Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus
  Коммерческие компоненты и утилиты для Delphi/BCB
  Вопросы по компонентам для Delphi, C++ Builder разных версий
  Новые языковые возможности, начиная с Delphi 2005 по XE4 — здесь, и New!здесь еще
  Англоязычный официальный форум Embarcadero — здесь
  Embarcadero Quality Central, веб интерфейс — здесь, новый Quality Portal тут
  Программирование на Delphi — викиверситет
  Другие ресурсы
   Предыдущие бумаги
 
     Вопросы ..XE4       Вопросы ..XE3    Вопросы ..XE2      
  Вопросы ..2009-XE    Вопросы ..<2009 / ч.5    Вопросы ..<2009 / ч.4      
  Вопросы ..<2009 / ч.3    Вопросы ..Delphi 2 / ч.2    Вопросы ..Delphi  

  Выключение встроенного эксперта Castalia  для XE8 (иногда помогает при вылетах и тормозах)  
  Полезные плагины(эксперты)

Всего записей: 948 | Зарегистр. 06-02-2007 | Отправлено: 15:25 11-09-2013 | Исправлено: Komandor, 15:49 31-03-2024
Samotek

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SuPriTo
Спасибо, но дело видно в чем-то другом...

Всего записей: 2447 | Зарегистр. 18-05-2005 | Отправлено: 13:24 02-02-2015
Alexey_Gawrilow



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AlekXL

Цитата:
Можно ли как-то этой обойти, не указывая явно IBase в списке поддерживаемых интерфейсов в TmyClass?

перекрыть QueryInterface

Всего записей: 640 | Зарегистр. 08-09-2003 | Отправлено: 14:04 02-02-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
поскольку в таблице интерфейсов класса TmyClass нет IBase, то QueryInterface(IBase,..), выполненный на экзепляре IDerived, завершиться неудачей.  


Код:
 
TMyClass.Create as IBase;
 

или

Код:
var
  obj: TMyClass;
  obj_base: IBase;
begin
  obj_base := obj as IBase;
...
 

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 21:26 02-02-2015
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield
это не годится. Класс наперед не известен
Код

Код:
var
  obj: TMyClass;
  obj_base: IBase;
begin
  obj_base := obj as IBase;  

не работает, вылетает Interface not supported
 
SuPriTo
Твой код

Код:
 
program Project2;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  System.SysUtils, System.Rtti;
 
type
  IBase=interface
    ['{664547B3-F4CD-4BCD-B742-687D69204B73}']
 
  end;
  IDerived=interface(IBase)
    ['{B6D69E3D-40B3-4945-B20B-7B9DF8B71D91}']
 
  end;
 
  TmyClass=class(TInterfacedObject, IDerived)
  end;
 
var c : TRttiContext;
    t : TRttiInstanceType;
    a : TArray<TRttiInterfaceType>;
    i : TRttiInterfaceType;
begin
  try
    c := TRttiContext.Create;
    t := c.GetType(TypeInfo(TMyClass)) as TRttiInstanceType;
    a := t.GetDeclaredImplementedInterfaces;
    i := a[0];
 
    Writeln(GUIDToString(i.BaseType.GUID));
    {if Supports(TmyClass, IBase) then
      Writeln('Yes')
    else
      Writeln('No');}
    Readln;
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;  

работает. RTTI видит реализацию IBase,
но QueryInterface и GetInterface не работают.
Очевидно, неявная реализация отличается от поддержки
Вдобавок, все это мне нужно под D2007, так что код должен быть другим.
 
Alexey_Gawrilow
 

Цитата:
перекрыть QueryInterface

Если уж перекрывать, то сразу в корневом классе, типа TMyInterfacedObject, чтобы на основе RTTI вытаскивать все неявные реализации унаследованных интерфейсов.
 
 
 
 
 
Добавлено:
статья http://hallvards.blogspot.ru/2006/08/extended-interface-rtti.html
показывает,как получить из typeInfo(IDerived) всю информацию по интерфейсу, включая предка, и даже сигнатуры методов(при $METHODINFO ON)
Но как получить typeInfo по экзепляру интерфейса, чей конкретный тип наперед неизвестен?
Для класса это тривиально : Obj.ClassInfo()
А для IInterface? Или даже IID?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 23:12 02-02-2015
Alexey_Gawrilow



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AlekXL

Цитата:
перекрыть QueryInterface


Цитата:
Если уж перекрывать, то сразу в корневом классе

 
Я использую на полную катушку в качестве ServiceLocator.
У меня ГлавнаяФорма, ГлавныйМодуль могут вообще не знать о интерфейсе ничего.
И тем не менее его реализовать.. не сами конечно.
Если модуль(dcu) затесался в uses, или подгружен динамически(dll)...
 
И получится, как у Миши Гавриленко, форма есть, но найти он ее не может
чесно слово, я не специально
Ты видишь суслика? И я нет, а он есть!


----------
C уважением, Алексей.
-----------------------------------------------
Хороших %s не бывает — бывает не худший вариант.

Всего записей: 640 | Зарегистр. 08-09-2003 | Отправлено: 03:17 03-02-2015
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexey_Gawrilow
 

Цитата:
Я использую на полную катушку в качестве ServiceLocator.
У меня ГлавнаяФорма, ГлавныйМодуль могут вообще не знать о интерфейсе ничего.
И тем не менее его реализовать.. не сами конечно.
Если модуль(dcu) затесался в uses, или подгружен динамически(dll)...  

 
я тоже к подобному пришел, когда у меня появились проблемы с unit circular reference.
 
Сначала решил проблему, разбив основные модули на несколько штук, но выходило, что компилятор по 5 раз пытался скомпилить юнит один, проходя по списку uses в Interface и Implementation.
 
Потом заинтерфейсил, скрепя сердце, основные классы, и дошел до ServiceLocator. Другое дело, что в современной Delphi , фреймворк Spring4Delphi ужасно толстый. А вот под 2007 есть оказывается фреймворк DDioc, который делает то же, и утизилизует $METHODINFO на всю катушку.
Там есть свой инвокер-- генератор бинарного кода, который может вызвать , вероятно, любой метод, с параметрами по его сигнатуре. После незначительного допила, удается вызывать конструктор с параметрами наперед неизвестного класса с реализацией нужного интерфейса. Все это -- под классическими D2007.
 
$METHODINFO+DDioc также открывает интересные возможности по экспорту классов в dws2(оригинальный dws2 с sf.net). Раньше я с automated RTTI страдал.
 
Но я не совсем понимаю, зачем классу реализовывать неявно интерфейс, если самому классу даже контракт неизвестен? Чтобы главный интерфейс(у меня это IEngine) можно было привести к любому аспекту функционала?
У меня просто есть юнит InterfaceServices, в котором есть singleton сервис локатора.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 04:44 03-02-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
не работает, вылетает Interface not supported  

Проверил, всё отлично работает под ХЕ7. Какой будет класс-имплементатор не важно: <instance> as <intf> будет отрабатывать. Либо вы чего-то не договариваете/неправильно описываете.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 09:40 03-02-2015 | Исправлено: Eternal_Shield, 09:41 03-02-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eternal_Shield

Цитата:
Проверил, всё отлично работает под ХЕ7.

Проверил - не работает. И не должно работать. Интерфейс - это всего лишь табличка с адресами методов, как VMT, но которую можно пронумеровать гуидом.
>IDerived=interface(IBase)
говорит только о том, что в этой табличке должны быть реализованы все методы IBase.
>TmyClass=class(TInterfacedObject, IBase, IDerived)
говорит что QueryInterface может по номеру/гуиду отдать IBase и IDerived. Оператор
>obj_base := obj as IBase;
вызывает виртуальный метод QueryInterface который не может найти IBase.
 

Цитата:
вы чего-то не договариваете/неправильно описываете.

Добуквенно
 
All
Не хотел прерывать интересную тему про интерфейсы, но у меня "борьба с привидениями", мягко сказано. Не знаю, связано ли с XE7 или с очередными обновами винды, но может уже у кого есть опыт... В программе происходит то чего не может быть.) Это если судить по тексту. Вываливается окно в определённый момент, которое не может там вываливаться. Только благодаря терпению клиента удалось выцарапать логи и найти единственный промежуток от и до, когда появилось окно. У меня было подозрение, что может быть такое... Что же я увидел? На всём промежутке кода - самое подозрительное Application.ProccessMessages. Функционал задействован простой акцией у которой ShortCut = Enter. Ранее, за предыдущие мои 3 года с данным ПО, никто не жаловался. И я уже предполагал, что двойного вызова акций уже не бывает. Что нибудь есть на этот счёт? Спасибо.
 
Добавлено:
Eternal_Shield

Цитата:
Какой будет класс-имплементатор не важно

Да заметил, а при чём сдесь имплементатор? Имплеметация - (зарезервированное слово implement) это проще говоря перенаправление вызовов методов от одной аггрегирующей инстанции/объекта к другой аггрегируемой инстанции/интерфейсу. С наследованием как то не связано вообще.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 13:53 03-02-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL
xpin2013
Да, всё верно. Не работает. Это мой косяк. В консольном приложении без модуля System.SysUtils приложение якобы нормально "отрабатывает", а на самом деле эксепшон.
 
Надо было не чистить юнит, эх.  
 

Цитата:
Да заметил, а при чём сдесь имплементатор?  

TMyClass - что это, если не имплементатор?! Хорошо, тогда используем слово "реализатор". Раз уже мы у него берём таблицу интерфейсов, то он прямой участник ... а как там реализовано наследование интерфейсов под капотом (массивом [в Delphi] или списком [C#]) - это уже не важно. Главное как работать с этой реализацией.

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 15:24 03-02-2015 | Исправлено: Eternal_Shield, 15:30 03-02-2015
Alexey_Gawrilow



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
AlekXL  xpin2013
Eternal_Shield
Добуквенно
Где-то я это уже видел..
 
http://rsdn.ru/article/delphi/delphi_7_06.xml

Цитата:
 
Однако, если класс реализует производный интерфейс, то это совсем не означает, что он совместим с базовым интерфейсом (см. рисунок 6.4):
Для совместимости с базовым интерфейсом нужно реализовать этот интерфейс явно:
Теперь класс TExtendedTextReader совместим и с интерфейсом ITextReader, поэтому следующее присваивание корректно:
Исключением из только что описанного правила является совместимость всех снабженных интерфейсами объектов с интерфейсом IInterface:
 

 
Пробуйте через получение IInterface(IUnknown) сначала.
Дома Delphi нет/
 
 
 
Добавлено:
не могу найти более заслуживающий домверия источник.

----------
C уважением, Алексей.
-----------------------------------------------
Хороших %s не бывает — бывает не худший вариант.

Всего записей: 640 | Зарегистр. 08-09-2003 | Отправлено: 15:40 03-02-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Добуквенно  

Поскольку таблица реализована массивом, то хардкаст работает:
Код:
obj_base := IBase(obj as IDerived);

 

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 15:41 03-02-2015 | Исправлено: Eternal_Shield, 15:44 03-02-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
это уже не важно. Главное как работать с этой реализацией.

В общем то не важно. Просто для меня имплементация и есть уточнение в этом не важном, что речь идёт не о "множественном наследовании Си", а о способе достижения того же самого, что и множественное наследование. В нашем случае ничего множественного.
 
Eternal_Shield
All

Цитата:
Вываливается окно в определённый момент, которое не может там вываливаться.


Цитата:
На всём промежутке кода - самое подозрительное Application.ProccessMessages.  

Хотелось бы по этому поводу информации, так как я даже гуглил, но может запрос составляю не удачно "ошибка двойное нажатие Delphi". Трудно найти.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 15:45 03-02-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Хотелось бы по этому поводу информации, так как я даже гуглил, но может запрос составляю не удачно "ошибка двойное нажатие Delphi". Трудно найти.

А что происходит то? двойной вызов TAction что ли?

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 15:52 03-02-2015
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
Из вопроса не совсем понятно сочетание этих факторов:
"Не знаю, связано ли с XE7 или с очередными обновами винды...
...Только благодаря терпению клиента удалось выцарапать логи...
...Ранее, за предыдущие мои 3 года с данным ПО, никто не жаловался..."
 
то ли Вы скомпиляли свою программу под XE7 и установили одному клиенту, то ли он обновил винду...
 
если из-за XE7 - то по идее и у Вас это должно "стрелять" - тогда дебаг в помощь,
а без исходников как-то трудно представить что происходит - соответственно и подсказать

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 16:03 03-02-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а без исходников как-то трудно представить что происходит


Цитата:
А что происходит то? двойной вызов TAction что ли?

Да происходит двойной вызов TAction
Происходит то, что я и пишу
Я примерно написал. Так как в DoAction есть заглушка, повторный вызов просто выходит из DoAction и доходит до CompareSum. Так как в первом вызове происходит Application.ProcessMessages, то обрабатывается повторное нажатие - DoAction не происходит а CompareSum вылетает, так как Do1 произошло, а Do2 не произошло и суммы соответственно разные.
 

Цитата:
если из-за XE7 - то по идее и у Вас это должно "стрелять" - тогда дебаг в помощь,

Оно и у клиента не всегда "стреляет". У клиента слабые компы и проворные ручки - гораздо быстрее работают чем мои крюки. Но факт, что у меня не воспроизводится потому что надо соответствующую модельку устройства ставить, у нас нет в коллекции, а по логам у клиента именно такая моделька. Для других моделек нет ProcessMessages.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 16:43 03-02-2015
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013

Цитата:
Происходит то, что я и пишу  

Жесть какая-то. Похожу шорткат уходит в TAction, а потом, через ProcessMessages, в какой-то другой обработчик типа OnKeyDown/Up;
Что это делает: fmMain.OnKeyPress := fmMain.FormKeyPress; в TAction?

Всего записей: 766 | Зарегистр. 18-05-2009 | Отправлено: 20:00 03-02-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Что это делает: fmMain.OnKeyPress := fmMain.FormKeyPress; в TAction?

Это всякие глупости для гридин dxGrid (старинный DevExpress). Типа замена запятой на точку.
 
Добавлено:

Цитата:
Похожу шорткат уходит в TAction, а потом, через ProcessMessages, в какой-то другой обработчик типа OnKeyDown/Up;  

Ну у TAction первый проход идёт по контролам окна и заканчивается выходом в Classes.StdWndProc, второй проход по акциям начинается с Application, так, что я даже не берусь предположить, как акция вызывается второй раз (и особенно почему второй раз, мне думается что в винде опять что-то меняется).

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 22:47 03-02-2015 | Исправлено: xpin2013, 23:36 03-02-2015
krapotkin

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
как и говорилось мильен раз, нельзя использовать ProcessMessages в обработчиках этих самых messages
я обрабатываю событие, но из очереди его еще не убрал
и вызываю обработку событий еще раз
что должно произойти??

Всего записей: 69 | Зарегистр. 10-01-2006 | Отправлено: 23:45 03-02-2015
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xpin2013
Судя по коду ProcessMessages используется для "оживления" прогресса выполнения.
Может тогда его заменить на методы Update, Refresh или чего там еще есть... Invalidate
для соответствующего контрола.
Хотя правильней, если это долгий процесс смотреть в сторону отдельного потока, имхо.

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 10:17 04-02-2015
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
krapotkin
Mic777
Спасибо.

Цитата:
но из очереди его еще не убрал

Об этом может судить только Windows, когда я ей отдам запись Msg.Result=0/1, пока не отдам 0, не получу повторно. У программы "нет очереди" - эту очередь для программы хранит Windows и удаляет сообщения из своей логики. Разные wm_KeyUp/KeyDown/KeyRepeat могут прилететь не последовательно.

Цитата:
нельзя использовать ProcessMessages в обработчиках этих самых messages

Известная истина. Но сам знаю, что при работе с дровами девайса, когда ничего не помогает кроме sleep(200) или ProccessMessages, при том что уже sleep(300) не помогает. Плюясь и перекрещиваясь пишу ProccessMessages - нехай хоть как то девайс работает. А если написано не мной, а девайса вообще нет и дрова не известны, то трогать PM не рискну.
 

Цитата:
Судя по коду ProcessMessages используется для "оживления" прогресса выполнения.

Точно нет. Абсолютно. Это, насколько я понимаю, единственное что помогло при интеграции  OLE/COM+ объекта драйвера. Никакого цикла для "оживления", и вызов конкретно после работы с устройством.
 

Цитата:
Хотя правильней, если это долгий процесс смотреть в сторону отдельного потока, имхо.

Это вообще не процесс, это "затычка" от которой не отказаться. Затычку плохо реализовали - флаг поставили внутри DoAction, но не на actActionExecute. Так бы CompareSum тоже был бы прикрыт затычкой. Тотальнее надо было решать.
 
ps.
По ответам выяснил, что ситуация всё же не является распространённой/известной/знакомой. Хотя krapotkin не убедил), но я полностью согласен - если можно без ProcessMessages, лучше потратить час, но избавиться, чем потом ловить глюки.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 11:50 04-02-2015
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Embarcadero RAD Studio


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru