PDA

Просмотр полной версии : Удобство vs размер.


F1reF0x
01.09.2005, 05:00
Удобство vs размер.

Intro.

Новчики часто удивляются почему даже программа "Hello world!" занимает 300 килобайт на диске, а всё потмоу что Delphi объектный язык. Конечно всё это хорошо. Но зачем нам тратить лишнее место, если например у метки (Label) чаще всего мы используем свойство Caption не трогая другие, а другие свойства всё равно занимают биты, байты, килобайты памяти. А если например вы пишете троян? То как незаметно впарить exe который весит 700 - 800 kb? Как сделать минимальное приложение? Не использовать объекты и писать на WinApi. Сейчас мы напишем программу которая просто выводит окно. На чистом WinApi.

begin

Когда вы открываите Delphi оно по умолчанию создаёт форму. Заходим View > Project manager и удаляем всё кроме Project1. Теперь открой исходник Project1. Ты должен увидеть что то вроде:

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Смело удаляй всё кроме верхней строчки. Тут мы напишем свой код.

program Mini;

uses
Windows,
messages,
sysutils;

var // Обявление перменных
Instance: HWnd;
WindowClass: TWndClass;
Handle: Hwnd;
msg: TMsg;



procedure DoExit; // процедура выхода из программы
begin
Halt;
end;


function WindowProc (Hwn, msg, wpr, lpr: longint): longint; stdcall; // функция обработки событий
begin
result:= defwindowproc(hwn, msg, wpr, lpr);

if msg=wm_destroy then // Если сообщение сообщение что окно будет закрыто то выполнить процедуру DoExit
DoExit;

if msg=wm_KeyDown then // Если сообщение сообщение что нажата клавиша, и если это клавиша esc то выполнить процедуру DoExit
if wpr=VK_ESCAPE then
DoExit;

end;

begin
// получения описания модуля
instance:= GetModuleHandle(nil); // WinApi функция GetModuleHandle считывает описания модуля instance

WindowClass.style:= CS_HRedraw or CS_Vredraw;
// Стиль окна. В данном случае указано что оно будет переисовыватся как только изменится вертикальный или горизонтальный размер

WindowClass.Lpfnwndproc:= @windowproc;
// Указатель на структуру которая будет реогировать на все события

WindowClass.Hinstance:= Instance;
// Укзатель на модуль

WindowClass.LpszClassName:= 'DX';
//Имя класса

WindowClass.HCursor:= LoadCursor(0, IDC_ARROW);
//Использовать стандартный курсор

RegisterClass (WindowClass);
// регистрация нового класса

// Создание окна
Handle:= CreateWindowEX (0, 'DX', 'Mini', WS_EX_CLIENTEDGE , 500, 200, 200, 200, 0, 0, Instance, nil);
// 'DX' - имя класса окна. 'Mini' - заголовок окна. WS_EX_CLIENTEDGE - вид окна. 500 - X окна. 200 - Y окна. 0 - родительское или нет окно. 0 - Идентификатор меню ил дочернего окна. Instance - Окно модуля.


ShowWindow(Handle, SW_Show);
// WinApi функция показать окно. Handle - Указатель на это окно. SW_Show - Активизирует окно и выводит его в текущей позиции.

UpdateWindow (Handle);
// Посылает сообщение, что надо перерисовть окно.


// цикл обработки сообщений
while (GetMessage(msg, 0, 0, 0)) do
begin
translatemessage(msg);
// Переводит комбинации сообщений

dispatchmessage (msg);
// Передаёт сообщение оконной функции


end;
end.

End;

Теперь можно запускать. Для выхода нажми "Esc". Тепрь сохрани это всё дело и откомпилируй. У меня размер программый получился 30 kb и это без сжатия компрессором! Вот и всё. Напоследок хочу посоветовать хороший учебник по WinApi который лежит тут http://www.progers.ru/e-books/cat1/17.htm. Хорошего конекта тебе :).

Автор: F1reF0x, пожелания на e-mail F1reFox[DoG]rin[тчк]ru или в icq 343222.

F1reF0x
01.09.2005, 18:22
Кстати. В дополнение ASPack очень хороший компрессор.

xSp1D3R
01.09.2005, 18:54
извини ща оффтоп но меня сейчас интересует озин вопрос
когда ты начел кодить на делфине то ты сначала учил паскаль а потом переходил на делфина или сразу учил делфина ? я вот сейчас изучаю турбо паскаль и мне просто интересно
кстати ты случайно не тот F1reFox который был на videohack ? ещё у вас там в команде был чел Sourse

F1reF0x
01.09.2005, 19:15
Я сразу начал кодить на Delphi.
Тот и есть :). Щас мне videohack кажется таки бредом %).

nerezus
01.09.2005, 20:35
паскаль учить перед делфи не стоит.

Кстати: делфи распрастранен только в россии. Стоит задуматься.

F1reF0x
01.09.2005, 20:45
Не только. Borland то не русские)

Cr4sh
01.09.2005, 21:08
Кстати: делфи распрастранен только в россии.
весьма и весьма спорно, просто *не_у_нас* непринято более-или менее серьёзные проекты писать на делфи
Стоит задуматься.
ага, use asm ;)

xSp1D3R
01.09.2005, 21:17
а почему не стоит, вить паскаль проще делфина а потом когда выучил паскаль то с делфином проще будет,, а насчёт делфина только в россии то это я не знал... вот это плоховато выходит, сам не в россии живу...

nerezus
01.09.2005, 21:22
паскаль - язык
делфи - среда

Cr4sh
01.09.2005, 21:24
а почему не стоит, вить паскаль проще делфина а потом когда выучил паскаль то с делфином проще будет.
Просто паскаль к делфи имеет такое же отношение как С к С#(читай - никакого), а если ты до этого коддингом не занимался, то тебе вообще без разницы будет, что с паскаля начинать, что с делфи, это раз; и делфи это не язик программирования, а интегрированая среда разработки для языка object-pascal, это два;

Raider
06.09.2005, 01:54
2 Афтар:
А зачем модуль SysUitis ? :) И ещё кое-что:
Ты пишешь сначало:
result:= defwindowproc(hwn, msg, wpr, lpr);
а надо наоборот, первым делом обрабатываем мессаги, а потом defwindowproc.
Вобщем типа того:
http://night444.narod.ru/delphi_min.rar

F1reF0x
06.09.2005, 11:30
SysUitis, вин апи использовать что бы.

Raider
06.09.2005, 16:14
Гм ... и какие ф-ции используются в показанном тобой примере, которые обьявленны в модуле SysUtils ? :)
(но те ф-ции что в SysUtils не являются ф-циями winapi, там ф-ции "утилиты",
чтобы нам с тобой :) проще кодить было)