Замена системных модулей для Delphi, Уменьшим размер WinAPI приложений на 9-11 кб. |
Добро пожаловать, гость ( Вход | Регистрация )
Замена системных модулей для Delphi, Уменьшим размер WinAPI приложений на 9-11 кб. |
Grom PE |
Nov 7 2007, 01:15
Сообщение
#1
|
Advanced Member Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) |
Как говорится, писал для себя, но думаю, пригодится и другим.
Если у вас чистый проект на Delphi, в котором используется только WinAPI, и по минимуму всяких встроенных функций языка, то большой шанс, что программу можно сократить примерно на 10 кб, используя эту замену системных модулей. Пропатченный компилятор от Delphi 7 — DCC32HACK, нацеленный на минимальный размер WinAPI программ, а также обновленная замена системных модулей внутри. http://grompe.org.ru/files/dcc7hack.rar |
Grom PE |
Mar 6 2008, 08:42
Сообщение
#2
|
Advanced Member Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) |
Обновление:
— замена протестирована на Delphi 4, 5, 6, 7, 2006, 2007; — частично восстановлена работа с юникодом и WideString; — восстановлена компиляция DLL; — мелкие изменения и исправления. Скоро будет замена компилятора, кто хочет потестировать пропатченный компилятор (Delphi 7), пишите в ICQ. Спасибо сказали:
|
-=CHE@TER=- |
Feb 15 2010, 16:28
Сообщение
#3
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
С заголовками функций GetDiskFreeSpaceEx в "Windows_int.inc" косяк был: PLargeInteger вместо TLargeInteger - исправил, плюс там точка с запятой была, вместо запятой - т.е. 2 и 3 параметры вообще были без типов.
После исправления: CODE function GetDiskFreeSpaceEx(lpDirectoryName: PChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: TLargeInteger): BOOL; stdcall; function GetDiskFreeSpaceExA(lpDirectoryName: PAnsiChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: TLargeInteger): BOOL; stdcall; function GetDiskFreeSpaceExW(lpDirectoryName: PWideChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: TLargeInteger): BOOL; stdcall; |
-=CHE@TER=- |
May 3 2010, 10:08
Сообщение
#4
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Вопрос - чем можно воспользоваться в Delphi для увеличения длины строки до нужного размера?
Если писать так: CODE SetLength(S, Len); То при использовании DCC32HACK в готовый код пихается куча всякого барохла, в частности строчка имени программы указанная в: CODE Program PrgName; Т.е. в исполняемый файл зачем-то пихается строчка "PRGNAME", если не писать "Program...", то на месте "PRGNAME" будет слово "PROGRAM". Зачем это делается - знают только в фирме Borland. Если использовать: CODE S:=#32; While Length(S) < Len Do S:=S + S[1]; То это долго. Можно конечно и так: CODE S:=#32; While Length(S) < Len Do S:=S + S; S:=Copy(S, 1, Len); Но при большом Len это будет занимать в два раза больше чем надо памяти на финальном шаге - как следствие жуткие тормоза при реаллоцировании. Есть какие-нибудь ещё способы удобные? Для тех случаев, когда нужна именно строка - когда нужен просто буфер, то там и GetMem()'ом обойтись можно... Или тогда вопрос к Grom PE ты можешь в DCC32HACK как-нибудь перехватить работу с SetLength()?.. Спасибо сказали:
|
Grom PE |
May 6 2010, 02:16
Сообщение
#5
|
Advanced Member Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) |
Или тогда вопрос к Grom PE ты можешь в DCC32HACK как-нибудь перехватить работу с SetLength()?.. Похоже, это надо копаться в механизме RTTI и выискивать обращение к именам. Посмотрю как-нибудь.. Спасибо сказали:
|
Grom PE |
Mar 23 2012, 20:45
Сообщение
#6
|
Advanced Member Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) |
Набрёл на Embarcadero RAD Studio XE2 with Update 4, буду ковыряться в системных модулях Delphi этого чуда. Что нового в языке, обозначено тут:
http://edn.embarcadero.com/article/images/...ture_Matrix.pdf Хотя не уверен, с какой версией это сравнение. Стоящее дело? Спасибо сказали:
|
-=CHE@TER=- |
Mar 24 2012, 12:16
Сообщение
#7
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Стоящее дело? О-о-о!.. Сколько там свистелок и пыхтелок добавили.Теперь пустая форма VCL, наверное, уже не 450 Кб, а все 10 Мб занимает, нет? Что касается новых фич - если ими пользоваться, то отваливается поддержка Delphi 7 и ниже. И я, кстати, не уверен, что .EXE файлы сделанные под эту хрень будут работать в Windows 98 - что-то меня после прочтения по диагонали этого документа взяли сомнения, что меньше чем под Windows XP оно не запустится. А вот если их компилятор научился нормально константы выносить и при этом не генерировать код хуже чем был - то я только рад буду. |
Grom PE |
Mar 24 2012, 15:47
Сообщение
#8
|
Advanced Member Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) |
Пустая VCL форма теперь 1 307 136 байт.
EXE-шники компилирует с Bound Imports, Delay Imports, и версией ОС 5.0. Строки по умолчанию записываются в юникоде. Там некоторые демки не то, что не под Win98, Windows 7 требуют! Хотя если пошаманить и писать на чистом WinAPI, можно использовать unicows.dll под Win98, править версию ОС в заголовке и будет работать. Вроде обещают, что кодогенератор сделали лучше, то есть возможно улучшение производительности, если перекомпилировать WinAPI-шные программы. А ещё они наконец-то научили Delphi MS COFF .OBJ понимать, теперь Delphi будет менее замкнутым, можно линковать с FASM'ом, например. Какую выгоду приносят Bound Imports и Delay Imports, я так и не понял. На пару секунд ускоряют время загрузки VCL-монстра с тонной импортов? =) QUOTE А вот если их компилятор научился нормально константы выносить и при этом не генерировать код хуже чем был - то я только рад буду. А можешь конкретный текст программы привести, чтоб на нём разницу посмотреть? |
-=CHE@TER=- |
Mar 24 2012, 18:59
Сообщение
#9
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Нафиг тогда такого монстра.
А можешь конкретный текст программы привести, чтоб на нём разницу посмотреть? Запросто - посмотри сколько раз в .EXE файле будет встречаться строчка, если раскоментарить define для STDWAY: CODE Program test; {$APPTYPE CONSOLE} Uses Windows; {.$DEFINE STDWAY} Const {$IFDEF STDWAY} S = '.\test.ini'; {$ELSE} S: String[11] = '.\test.ini'#0; {$ENDIF} Procedure test1; Begin WritePrivateProfileString('name', 'test1', 'value1', {$IFDEF STDWAY} PChar(S) {$ELSE} PChar(@S[1]) {$ENDIF} ); End; Procedure test2; Begin WritePrivateProfileString('name', 'test2', 'value2', {$IFDEF STDWAY} PChar(S) {$ELSE} PChar(@S[1]) {$ENDIF} ); End; Begin test1; test2; WritePrivateProfileString('name', 'main', 'value3', {$IFDEF STDWAY} PChar(S) {$ELSE} PChar(@S[1]) {$ENDIF} ); End. Добавлено: Хм. А если объявлять как: CODE Var S: String = '.\test.ini'; Тогда она не дублирует... |
Grom PE |
Mar 24 2012, 20:13
Сообщение
#10
|
Advanced Member Группа: CTPAX-X Сообщений: 84 Регистрация: 7-February 08 Из: i@grompe.org.ru Пользователь №: 3,120 Спасибо сказали: 95 раз(а) |
QUOTE Нафиг тогда такого монстра. Так нас же VCL не интересует, а совершенно голый проект должен быть таких же размеров, как и с Delphi 7.QUOTE Запросто - посмотри сколько раз в .EXE файле будет встречаться строчка, если раскоментарить define для STDWAY: Три раза, но в юникоде %)Вот что нового со времён Delphi 7, вычитал из документов и интернета: - multi-unit namespaces (Vcl.Forms, System.SysUtils, etc.) - for ... in ... do loops - Exit(Result) - inline functions - operator overloading - class helpers - strict private, strict protected - constructors, operator overloading, static methods and properties in records - class: abstract, sealed, const, type, var, property - nested classes - final virtual methods - other code optimizations (?) - generics - anonymous methods - {$SETPEFLAGS 1} = no relocs - {$POINTERMATH}, {$RTTI}, {$SCOPEDENUMS} - new warnings - strings and APIs are unicode by default - enhanced RTTI (reflection, RTTI.pas) - libraries, frameworks, all those bells and whistles - 64-bit compilation - Mac OSX compilation - COFF .OBJ support Спасибо сказали:
|
Упрощённая версия | Сейчас: 1st November 2024 - 23:25 |