Приветствую.
Буквально сегодня обсуждал с коллегой по работе интерфейсы. Он мне рассказал о своем интересном приеме, я ему о своем, но только по дороге домой я осознал всю мощь этих приемов, в особенности если объединить их вместе.
Любители удобной автоматики и MVC паттернов — прошу под кат.
Читать полностью »
Рубрика «Delphi» - 15
Трюки с интерфейсами в Delphi
2014-04-16 в 18:30, admin, рубрики: Delphi, интерфейсы, трюки, метки: Delphi, интерфейсы, трюкиВведение
Просматривая ленту, наткнулся на статью Неправильное использование атомов и трудноуловимая бага в VCL. После прочтения возникла мысль описать еще одну проблему в той же самой области, о которой не рассказано в этой статье. Наша команда натолкнулась на нее самостоятельно, потом оказалось, что это уже известный баг VCL. Разработка ведется на Delphi 7, и я не уверен, существует ли ошибка в более новых версиях. Судя по приведенным чуть ниже ссылкам, есть, как есть и исправление. На исправление версии 7 надеяться, по понятным причинам, не приходится.
В статье MrShoor описывается переполнение т.н. таблицы атомов в случае, если приложение на Delphi завершено некорректно, и некоторые атомы не удаляются. Оказывается, для переполнения таблицы атомов вовсе необязательно «убивать насильно» ваше приложение. Вполне достаточно его запустить и корректно закрыть, но много-много раз подряд.
Давайте посмотрим, как это происходит:Читать полностью »
Обзор Appmethod [Много картинок]
2014-03-19 в 20:27, admin, рубрики: Delphi, FireMonkey, тлен, метки: Delphi, FireMonkey, тлен
В данном посте я выражаю свое мнение, и он может показаться слишком эмоциональным.
Некоторое время назад Embacadero анонсировала Appmethod — среда разработки для Windows, OSX, iOS, Android, с помощью Firemonkey.
На Techcrunch обещали, что будет Express версия но сразу после официального выхода Appmethod стало известно что, возможно будет, но будет иметь ограничения: http://www.embarcadero.com/products/rad-studio/appmethod-faq. Скачать триальную версию можно здесь: http://www.appmethod.com/.
Лично я возлагал большие надежды на Appmethod, надеялся что они, наконец, исправили глупые баги Firemonkey.
Читать полностью »
Arduino: ИК-управление бытовой техникой (применение девайса)
2014-03-19 в 11:03, admin, рубрики: arduino, Delphi, пду, умный дом, метки: arduino, Delphi, пду, умный дом Задравствуй хабр! По отзывам понял, что в статье «Arduino: ИК-управление бытовой техникой» мало посвятил конечной цели устройства и как его применять на практике, по-этому займусь этим сейчас.
Назначение нашего arduino-девайса обеспечить управление набором устройств, управляемых по ИК-каналу. На следующем рисунке изображен пример того как можно использовать данный девайс, сейчас пока ко мне не приехал Ethernet Shield опишу на примере USB соединения с сервером.
Читать полностью »
Простая прокси-DLL своими руками
2014-03-11 в 13:54, admin, рубрики: Delphi, dll, proxy, windows, системное программирование, метки: Delphi, dll, proxy, windows, ассемблерПонадобилось мне перехватывать вызовы GDS32.DLL. Решил написать прокси-dll.
Пишем исследовательский стенд
Первое, что нам нужно — это получить список всех экспортируемых функций из настоящей dll.
Сделаем это следующим кодом:
1. program GetFuncsDll;
2. {$APPTYPE CONSOLE}
3. uses Windows;
4. var
5. ImageBase: DWORD; //адрес образа dll
6. pNtHeaders: PImageNtHeaders; // PE заголовок dll
7. IED: PImageExportDirectory; // адрес таблицы экспорта
8. ExportAddr: TImageDataDirectory; // таблица экспорта
9. I: DWORD; // переменная для цикла
10. NamesCursor: PDWORD; // указатель на адрес имени функции
11. OrdinalCursor: PWORD; // указатель на адрес номера функции
12. LIB_NAME:AnsiString; // имя dll
13. BEGIN
14. LIB_NAME:='MiniLib.dll';
15. loadlibraryA(PAnsiChar(LIB_NAME));
16. ImageBase := GetModuleHandleA(PAnsiChar(LIB_NAME));
17. pNtHeaders := Pointer(ImageBase + DWORD(PImageDosHeader(ImageBase)^._lfanew));
18. ExportAddr := pNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
19. IED := PImageExportDirectory(ImageBase+ExportAddr.VirtualAddress);
20. NamesCursor := Pointer(ImageBase + DWORD(IED^.AddressOfNames));
21. OrdinalCursor := Pointer(ImageBase + DWORD(IED^.AddressOfNameOrdinals));
22. For I:=0 to Integer(IED^.NumberOfNames-1) do begin
23. WriteLn(output,PAnsiChar(ImageBase + PDWORD(NamesCursor)^),'=',OrdinalCursor^ + IED^.Base);
24. Inc(NamesCursor);
25. Inc(OrdinalCursor);
26. end;
27. Readln;
28. end.
Листинг 1
Здесь трудностей вроде нет. Добираемся последовательно до таблицы экспорта (строка 19) указателей на массив имен(NamesCursor) и массива номеров(OrdinalCursor) и читаем функцию за функцией, имена и номера. Количество функций находится в поле NumberOfNames. Этот код был добыт на просторах интернета, потом доработан и упрощён.
Читать полностью »
Интересный и волнующий баг сегодня нашел в Delphi XE5 и опубликовал владелец g+ комьюнити Delphi Developers, Lars Fosdal.
При некоторых условиях, True or False or False вычисляется в False, при этом (True or False or False) вычисляется в ожидаемое True.
В комментариях также замечают, что был случай когда x := True or True or True также выдавал False
Читать полностью »
Черная пятница. Как же всё было на самом деле
2014-01-14 в 17:33, admin, рубрики: Delphi, анализ данных, Инфографика, исследование, Исследования и прогнозы в IT, Программирование, черная пятница, метки: анализ данных, исследование, Программирование, черная пятница
6 декабря 2013 года в России проходила черная пятница. Было заявлено о больших скидках.
Я узнал об этом в одной статье еще за месяц до начала. Прочитав много комментариев к той статье, я понял, что все пользователи сходятся во мнении, что:
- Никаких грандиозных скидок не будет.
- Если скидки всё-таки будут, то только на те товары, которые не очень то и нужны.
- Сама скидка сводится к тому, что в этот день цена товара завышается, а за счет скидки понижается до первоначального уровня, но никак не меньше.
Было решено узнать, а как всё происходит на самом деле.
В той статье упоминались несколько компаний, участвующих в акции. Я выбрал 2 компании для анализа: Сотмаркет и Белый Ветер.
Читать полностью »