Авторские статьи Удобство vs размер.

Discussion in 'Статьи' started by F1reF0x, 1 Sep 2005.

  1. F1reF0x

    F1reF0x Elder - Старейшина

    Joined:
    13 Nov 2004
    Messages:
    14
    Likes Received:
    9
    Reputations:
    10
    Удобство 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.
     
  2. F1reF0x

    F1reF0x Elder - Старейшина

    Joined:
    13 Nov 2004
    Messages:
    14
    Likes Received:
    9
    Reputations:
    10
    Кстати. В дополнение ASPack очень хороший компрессор.
     
  3. xSp1D3R

    xSp1D3R Elder - Старейшина

    Joined:
    26 Apr 2005
    Messages:
    60
    Likes Received:
    6
    Reputations:
    0
    извини ща оффтоп но меня сейчас интересует озин вопрос
    когда ты начел кодить на делфине то ты сначала учил паскаль а потом переходил на делфина или сразу учил делфина ? я вот сейчас изучаю турбо паскаль и мне просто интересно
    кстати ты случайно не тот F1reFox который был на videohack ? ещё у вас там в команде был чел Sourse
     
    #3 xSp1D3R, 1 Sep 2005
    Last edited: 1 Sep 2005
  4. F1reF0x

    F1reF0x Elder - Старейшина

    Joined:
    13 Nov 2004
    Messages:
    14
    Likes Received:
    9
    Reputations:
    10
    Я сразу начал кодить на Delphi.
    Тот и есть :). Щас мне videohack кажется таки бредом %).
     
  5. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    паскаль учить перед делфи не стоит.

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

    F1reF0x Elder - Старейшина

    Joined:
    13 Nov 2004
    Messages:
    14
    Likes Received:
    9
    Reputations:
    10
    Не только. Borland то не русские)
     
  7. Cr4sh

    Cr4sh net maniac

    Joined:
    25 Aug 2005
    Messages:
    30
    Likes Received:
    22
    Reputations:
    27
    весьма и весьма спорно, просто *не_у_нас* непринято более-или менее серьёзные проекты писать на делфи
    ага, use asm ;)
     
  8. xSp1D3R

    xSp1D3R Elder - Старейшина

    Joined:
    26 Apr 2005
    Messages:
    60
    Likes Received:
    6
    Reputations:
    0
    а почему не стоит, вить паскаль проще делфина а потом когда выучил паскаль то с делфином проще будет,, а насчёт делфина только в россии то это я не знал... вот это плоховато выходит, сам не в россии живу...
     
  9. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    паскаль - язык
    делфи - среда
     
  10. Cr4sh

    Cr4sh net maniac

    Joined:
    25 Aug 2005
    Messages:
    30
    Likes Received:
    22
    Reputations:
    27
    Просто паскаль к делфи имеет такое же отношение как С к С#(читай - никакого), а если ты до этого коддингом не занимался, то тебе вообще без разницы будет, что с паскаля начинать, что с делфи, это раз; и делфи это не язик программирования, а интегрированая среда разработки для языка object-pascal, это два;
     
    #10 Cr4sh, 1 Sep 2005
    Last edited: 1 Sep 2005
  11. Raider

    Raider Elder - Старейшина

    Joined:
    2 May 2005
    Messages:
    40
    Likes Received:
    5
    Reputations:
    4
    2 Афтар:
    А зачем модуль SysUitis ? :) И ещё кое-что:
    Ты пишешь сначало:
    result:= defwindowproc(hwn, msg, wpr, lpr);
    а надо наоборот, первым делом обрабатываем мессаги, а потом defwindowproc.
    Вобщем типа того:
    http://night444.narod.ru/delphi_min.rar
     
  12. F1reF0x

    F1reF0x Elder - Старейшина

    Joined:
    13 Nov 2004
    Messages:
    14
    Likes Received:
    9
    Reputations:
    10
    SysUitis, вин апи использовать что бы.
     
  13. Raider

    Raider Elder - Старейшина

    Joined:
    2 May 2005
    Messages:
    40
    Likes Received:
    5
    Reputations:
    4
    Гм ... и какие ф-ции используются в показанном тобой примере, которые обьявленны в модуле SysUtils ? :)
    (но те ф-ции что в SysUtils не являются ф-циями winapi, там ф-ции "утилиты",
    чтобы нам с тобой :) проще кодить было)