Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› VCL to winapi |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 15 марта 2008 13:10 · Личное сообщение · #1 Возникла задача- сделать интерфейс к программе на winapi. Кое-что сделал, дальше застрял. Пробовал также использовать программу APIx - Visual WinAPI. Но там мало компонентов(и это проект, кажется, заброшен). Вот думаю, реально ли сделать сначала на делфи - разместить все компоненты и т.п., а затем как-то перехватить вызовы api и переделать все на чистый winapi. Если это как-то возможно, буду рад советам и рекомендациям. ![]() |
|
Создано: 15 марта 2008 14:12 · Личное сообщение · #2 |
|
Создано: 15 марта 2008 14:14 · Личное сообщение · #3 |
|
Создано: 15 марта 2008 14:24 · Личное сообщение · #4 |
|
Создано: 15 марта 2008 14:32 · Личное сообщение · #5 |
|
Создано: 15 марта 2008 15:04 · Личное сообщение · #6 |
|
Создано: 15 марта 2008 15:26 · Личное сообщение · #7 |
|
Создано: 15 марта 2008 15:48 · Личное сообщение · #8 |
|
Создано: 15 марта 2008 16:32 · Личное сообщение · #9 |
|
Создано: 15 марта 2008 17:39 · Поправил: NeoTall · Личное сообщение · #10 Mavlyudov пишет: KOL? ну и чем он лучше api? Сравнивать объектную модель для Delphi и WinAPI по-моему глупо, все равно все основано на API, и VCL, и KOL. Я лишь предложил, простой вариант создания компактных приложений на Дельфи... Нет, если Вас прикалывает программить на чистом API, пожалуйста... Но вы упомянули APIx, а значит, тоже не хотите особо заморачиваться... Mavlyudov пишет: можно там интерфест создать? Если Вы имеете ввиду интерфейс, то почему же нет... Все очень доступно и просто. Устанавливаете MCK (Mirror Classes Kit), и получаете нормальную среду для визуальной разработки в Дельфи. Можете просто "чистый" KOL использовать... v0id2k пишет: не, фтопку кол. Глючный он. Не подскажите, а какой последней версией Вы пользовались? И в чем глюки проявлялись? v0id2k пишет: Автокадовские менюшки йа не видел. Можешь сделать меню через ресурсы, ибо через апи тоже можно, но наеб##сo с ними)) Я конечно давно автокадом не пользовался и не знаю, что такое "Автокадовские менюшки". Но, это что, такой новый контрол винды, что Вы его в ресурс закидываете? Как я понимаю, все равно же придется ручную отрисовку делать...или нет? ![]() |
|
Создано: 15 марта 2008 17:51 · Личное сообщение · #11 |
|
Создано: 15 марта 2008 18:09 · Личное сообщение · #12 |
|
Создано: 15 марта 2008 21:09 · Личное сообщение · #13 |
|
Создано: 15 марта 2008 23:41 · Личное сообщение · #14 |
|
Создано: 16 марта 2008 01:21 · Личное сообщение · #15 Mavlyudov пишет: Или дай что-нибудь почитать про иеню через ресурсы Win32 API. Эффективная разработка приложений www.knigka.info/2007/07/19/win32_api_jeffektivnaja_razrabotka_prilozhenijj__primery.html Так кроме книги есть и примеры, хотя там не на Дельфи а на С++, нo это сути win32 кодинга не меняет. ![]() |
|
Создано: 17 марта 2008 00:30 · Личное сообщение · #16 |
|
Создано: 17 марта 2008 00:40 · Личное сообщение · #17 |
|
Создано: 17 марта 2008 14:42 · Личное сообщение · #18 |
|
Создано: 17 марта 2008 20:23 · Личное сообщение · #19 Mavlyudov пишет: Может быть можно как-то перехватывать api-функции из проги на vcl, а потом сваять приложение на чистом апи? ...это типа удаление гланд через задницу? Зачем такой изврат?Войд тебе просто привёл маленький пример скрипта ресурсов.Тебе надо взять какую-нибудь документацию,например,справку по rc.exe(компилятору ресурсов) из пакета masm32 и смотреть,как создавать подобный скрипт самому,чтобы там были всевозможные элементы управления. ----- the Power of Reversing team ![]() |
|
Создано: 17 марта 2008 21:31 · Личное сообщение · #20 Изврат сплошной. Сначала делать интерфейс на дельфе, а потом разрисовывать все компоненты до апи - заколупаешься, классы разгребать и обработчики событий переписывать, и всякие констрэйнты и прочие навороты реализовать самому придется, а т.к. не будешь это инлайном везде в код впихивать - то будешь свою библиотечку писать, в итоге придешь к слабому подобию KOL. Если уже делать - то сразу на апи (ну или использовать дельфу+VCL для быстрого построения макета-прототипа интерфейса). ![]() |
|
Создано: 17 марта 2008 22:13 · Личное сообщение · #21 |
|
Создано: 18 марта 2008 13:30 · Личное сообщение · #22 Я вобще не понимаю в чем проблема. А кто мешает вынести апишный код в DLL и сделать приложение на дельфе использующее её? Или наоборот, DLL в которой реализовать GUI на дельфе (ну просто DLL с формами), а её использовать из приложения? Или вобще всё сделать на дельфе? Модуль windows.pas никто не отменял. ![]() |
|
Создано: 18 марта 2008 21:02 · Личное сообщение · #23 |
|
Создано: 26 марта 2008 09:49 · Личное сообщение · #24 |
|
Создано: 26 марта 2008 10:03 · Личное сообщение · #25 |
|
Создано: 28 марта 2008 13:04 · Личное сообщение · #26 |
|
Создано: 29 марта 2008 18:22 · Поправил: Stack · Личное сообщение · #27 Mavlyudov пишет: Пробовал также использовать программу APIx - Visual WinAPI. Но там мало компонентов Ну так напиши такую же прогу только с поддержкой плугинов. Хочешь компонент - раз плугин сочинил и все. И еще если гонка за размером то сразу на masm или fasm пиши а то совершенно пустой проект в delphi 2005 весит 17 кб. Вот думаю, реально ли сделать сначала на делфи - разместить все компоненты и т.п., а затем как-то перехватить вызовы api Проще уже будет самому компоненты разрисовывать. ----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74 ![]() |
|
Создано: 29 марта 2008 19:11 · Поправил: Assass1n · Личное сообщение · #28 Stack пишет: Ну так напиши такую же прогу только с поддержкой плугинов Если бы он мог написать, то тогда бы не задавал этого вопроса. Boss пишет: ну если KOL ненравится то почемубы не WinAsm Не надо путать разные языки программирования. Задача была перевести Delphi проект на винапи, а не написать тоже самое на масме. Boss пишет: и для взлома ДелпхиДекомпилер обломится Дельфийские декомпили обламываются на всех проектах где не присувствует модуль Forms. Минимальный размер программы написанной на Delphi, которую я видел, составлял всего 1,3 кб. ----- Я ещё не волшебник, я только учусь... ![]() |
|
Создано: 30 марта 2008 05:20 · Личное сообщение · #29 |
|
Создано: 30 марта 2008 11:53 · Личное сообщение · #30 Assass1n пишет: Минимальный размер программы написанной на Delphi, которую я видел, составлял всего 1,3 кб размер уменшается за счет изменения sysinit и system Минимальное приложение в Delphi Автор: XProger Для всех давно уже не секрет что использование VCL значительно увеличивает размер исполняемого файла созданного в Delphi. Но далеко не многие знают как избавиться от этих благ с целью уменьшения размера исполняемого файла. И даже не все те кто знают как это сделать, смогут написать программу размером в 524 байта! Собственно, такая программка и является целью данной статьи ![]() Итак, приступим! Инструменты: Delphi (проверялось на 7 версии), Restorator, migeel's Realigner, fakecom.com и UPX. Что и для чего нужно по порядку: Delphi – будет средой для написания нашего “монстра”! (собственно ничего кроме DCC32.EXE нам от неё не нужно ![]() Restorator – компилятор Delphi имеет хорошую привычку – писать в секцию “RCData” ресурса EXE файла debug информацию обо всех используемых модулях в программе. А вот при помощи этой утилиты мы сможем избавиться от этой секции! migeel's Realigner – утилитка, позволяющая уменьшить размер EXE файла, путем удаления таблицы релокаций, которая (в случае программ на Delphi) является абсолютно неиспользуемым балластом и может быть совершенно безболезненно удалена. Но иногда аналогичная программа StripReloc даёт лучшие результаты. fakecom.com – а вот этот “маньяк” размером в 60 байт, переконвертирует наш EXE в com файл! Зачем? Да за тем что у com файлов не имеется Win32/PE секции заголовка, как и самого заголовка вообще ![]() UPX – программа сжимающая исполняемые файлы. В нашем случае это будет полученный при помощи fakecom.com COM файл. Но даже если использовать все эти утилиты размер EXE не уменьшится ниже чем 3 кб. В чём же может быть проблема? Ответ на данный вопрос очевиден – в самой Delphi ![]() Теперь нужно найти эту проблему. Многие сваливают всё на компилятор, и это связанно с не знанием самой структуры Delphi. Для того чтобы скомпилировать dpr файл, компилятору необходимы всего 2 модуля: System, SysInit. Именно в них лежат основные процедуры для работы со строками, файлами, динамическими массивами, памятью и т.п. Т.е. всё что облегчает жизнь обычному Delphi программисту, но ведь Вы не обычный программист?! Вы в некоторй степени - “извращенец”, раз вам интересна данная статья! В противном случае попрошу завершить чтение, дабы не травмировать Вашу психику ;) Итак, имеем системные библиотеки со всякими вкусностями, от которых мы готовы отказаться ради программы в несколько сотен байт. Ну что ж, топор нам в руки: "System.pas" unit System; interface procedure _InitExe; procedure _HandleFinally; procedure _halt0; procedure ExitProcess(Code: LongWord); stdcall; external 'kernel32.dll'; type TGUID = record D1 : LongWord; D2 : Word; D3 : Word; D4 : array [0..7] of Byte; end; implementation procedure _InitExe; asm end; procedure _HandleFinally; asm end; procedure _halt0; begin ExitProcess(0); end; end. "SysInit.pas" unit SysInit; interface implementation end. Вот оно! Свершилось, мы сознательно отказались от всех благ Delphi! Но теперь нужно заставить Delphi компилятор брать именно наши системные заголовки. Для этого их необходимо скомпилировать в dcu библиотеки. Создаём папку, в неё кидаем наши pas заголовки и DCC32.EXE который можно взять тут “C:\Program Files\Borland\Delphi7\Bin”. В папку также кидаем все утилиты которые нам понадобятся (UPX, Realigner, fakecom.com) и создаём Project1.dpr с вот таким кодом: program Project1; begin end. Теперь в этой папке необходимо создать файл make.bat следующего содержания: dcc32 -q system sysinit -m -y -z -$D- dcc32 project1.dpr Данный BAT файл поможет скомпилировать программу. Ну чего же мы ждём? Запускай! В результате появится наш долгожданный EXE’шник! Смотрим на его размер… 3 584 байт!!! Это уже хорошо, но в начале статьи я обещал программу в 524 байта! ![]() При помощи программы Restorator 2004 удалим не нужный нам ресурс со страшными именем “RCData”. Смотрим на размер EXE… 3 072 байт! Следующие наши действия советую автоматизировать путём создания файлика make_min.bat: realign Project1.exe copy /B fakecom.com+Project1.exe Project1.com upx --best Project1.com Первая строка “покоцает” таблицу ровнения EXE файла, вторая преобразует его в COM, а третья сожмёт. Итак! 3…2…1…ЖМИ!!! Не пройдёт и секунды как в папке появится Project1.com размер которого ровно 524 байта!!! (В различных версиях Delphi результат может меняться) Программа конечно же ничего не делает, но даже это рассеивает сомнения многих программистов по поводу громоздкости программ написанных на Delphi ;) Под конец хотел бы рассказать, что Вас ждёт при написании подобных программ: НЕТ менеджера памяти, процедур для работы со строками и динамическими массивами, вследствии чего работа с оными будет производиться с использованием процедур и функций Win API, но это же Вас не остановит? ;) Удачи! P.S. Есть более "суровый" метод, который позволит добиться размера в 478 БАЙТ (!!!) но для этого, необходимо использовать Delphi 3 компилятор и Microsoft линковщик. Пример такой "минимальной" программы, находится здесь Пример ещё одной программы (884 байта) к статье с утилитами: Delphi_min.zip Многим смогут помочь, модули (system.pas, windows.pas и opengl.pas) немного переписанные ещё одним "извращенцем" - ShTiRLiC (http://progsoft.tk) ----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74 ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› VCL to winapi |