IPB

Добро пожаловать, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Замена системных модулей для 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 раз(а)



Как говорится, писал для себя, но думаю, пригодится и другим.

grompe.org.ru/files/delphisys.rar — Устарело, см. ниже

Если у вас чистый проект на Delphi, в котором используется только WinAPI, и по минимуму всяких встроенных функций языка, то большой шанс, что программу можно сократить примерно на 10 кб, используя эту замену системных модулей.


Пропатченный компилятор от Delphi 7 — DCC32HACK, нацеленный на минимальный размер WinAPI программ,
а также обновленная замена системных модулей внутри.

http://grompe.org.ru/files/dcc7hack.rar
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
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.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Feb 15 2010, 16:28
Сообщение #3


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,197
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 286 раз(а)



С заголовками функций 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;
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
May 3 2010, 10:08
Сообщение #4


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,197
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 286 раз(а)



Вопрос - чем можно воспользоваться в 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()?..


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Grom PE
May 6 2010, 02:16
Сообщение #5


Advanced Member
***

Группа: CTPAX-X
Сообщений: 84
Регистрация: 7-February 08
Из: i@grompe.org.ru
Пользователь №: 3,120
Спасибо сказали: 95 раз(а)



QUOTE(-=CHE@TER=- @ May 3 2010, 18:08) *
Или тогда вопрос к Grom PE ты можешь в DCC32HACK как-нибудь перехватить работу с SetLength()?..


Похоже, это надо копаться в механизме RTTI и выискивать обращение к именам. Посмотрю как-нибудь..



Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
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
Хотя не уверен, с какой версией это сравнение.
Стоящее дело?


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Mar 24 2012, 12:16
Сообщение #7


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,197
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 286 раз(а)



QUOTE(Grom PE @ Mar 23 2012, 20:45) *
Стоящее дело?
О-о-о!.. Сколько там свистелок и пыхтелок добавили.
Теперь пустая форма VCL, наверное, уже не 450 Кб, а все 10 Мб занимает, нет?
Что касается новых фич - если ими пользоваться, то отваливается поддержка Delphi 7 и ниже.
И я, кстати, не уверен, что .EXE файлы сделанные под эту хрень будут работать в Windows 98 - что-то меня после прочтения по диагонали этого документа взяли сомнения, что меньше чем под Windows XP оно не запустится.

А вот если их компилятор научился нормально константы выносить и при этом не генерировать код хуже чем был - то я только рад буду.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
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
А вот если их компилятор научился нормально константы выносить и при этом не генерировать код хуже чем был - то я только рад буду.

А можешь конкретный текст программы привести, чтоб на нём разницу посмотреть?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Mar 24 2012, 18:59
Сообщение #9


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,197
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 286 раз(а)



Нафиг тогда такого монстра.

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';

Тогда она не дублирует...
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
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


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 17th July 2019 - 22:27