Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Удобство vs размер. (https://forum.antichat.xyz/showthread.php?t=9185)

F1reF0x 01.09.2005 05:00

Удобство vs размер.
 
Удобство 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

Цитата:

Сообщение от nerezus
Кстати: делфи распрастранен только в россии.

весьма и весьма спорно, просто *не_у_нас* непринято более-или менее серьёзные проекты писать на делфи
Цитата:

Стоит задуматься.
ага, use asm ;)

xSp1D3R 01.09.2005 21:17

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

nerezus 01.09.2005 21:22

паскаль - язык
делфи - среда

Cr4sh 01.09.2005 21:24

Цитата:

Сообщение от xSp1D3R
а почему не стоит, вить паскаль проще делфина а потом когда выучил паскаль то с делфином проще будет.

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


Время: 02:38