Версия для печати темы
CTPAX-X _ Программы _ Замена системных модулей для Delphi
Автор: Grom PE Nov 7 2007, 01:15
Как говорится, писал для себя, но думаю, пригодится и другим.
grompe.org.ru/files/delphisys.rar — Устарело, см. ниже
Если у вас чистый проект на Delphi, в котором используется только WinAPI, и по минимуму всяких встроенных функций языка, то большой шанс, что программу можно сократить примерно на 10 кб, используя эту замену системных модулей.
Пропатченный компилятор от Delphi 7 — DCC32HACK, нацеленный на минимальный размер WinAPI программ,
а также обновленная замена системных модулей внутри.
http://grompe.org.ru/files/dcc7hack.rar
Автор: Grom PE Mar 6 2008, 08:42
Обновление:
— замена протестирована на Delphi 4, 5, 6, 7, 2006, 2007;
— частично восстановлена работа с юникодом и WideString;
— восстановлена компиляция DLL;
— мелкие изменения и исправления.
Скоро будет замена компилятора, кто хочет потестировать пропатченный компилятор (Delphi 7), пишите в ICQ.
Автор: -=CHE@TER=- Feb 15 2010, 16:28
С заголовками функций 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
Вопрос - чем можно воспользоваться в 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
QUOTE(-=CHE@TER=- @ May 3 2010, 18:08)
Или тогда вопрос к Grom PE ты можешь в DCC32HACK как-нибудь перехватить работу с SetLength()?..
Похоже, это надо копаться в механизме RTTI и выискивать обращение к именам. Посмотрю как-нибудь..
Автор: Grom PE Mar 23 2012, 20:45
Набрёл на Embarcadero RAD Studio XE2 with Update 4, буду ковыряться в системных модулях Delphi этого чуда. Что нового в языке, обозначено тут:
http://edn.embarcadero.com/article/images/41563/Delphi_XE2_Feature_Matrix.pdf
Хотя не уверен, с какой версией это сравнение.
Стоящее дело?
Автор: -=CHE@TER=- Mar 24 2012, 12:16
QUOTE(Grom PE @ Mar 23 2012, 20:45)
Стоящее дело?
О-о-о!.. Сколько там свистелок и пыхтелок добавили.
Теперь пустая форма VCL, наверное, уже не 450 Кб, а все 10 Мб занимает, нет?
Что касается новых фич - если ими пользоваться, то отваливается поддержка Delphi 7 и ниже.
И я, кстати, не уверен, что .EXE файлы сделанные под эту хрень будут работать в Windows 98 - что-то меня после прочтения по диагонали этого документа взяли сомнения, что меньше чем под Windows XP оно не запустится.
А вот если их компилятор научился нормально http://www.forum.ctpax-x.org/index.php?showtopic=51&st=60#entry3246 и при этом не генерировать код хуже чем был - то я только рад буду.
Автор: Grom PE Mar 24 2012, 15:47
Пустая 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
Нафиг тогда такого монстра.
QUOTE(Grom PE @ Mar 24 2012, 15:47)
А можешь конкретный текст программы привести, чтоб на нём разницу посмотреть?
Запросто - посмотри сколько раз в .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
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