![]() |
|
#1
|
|||
|
|||
![]() Про то как выводить данные через формы я разобрался. Следующий вопрос: разобраться как компилируется бинарный код.
Сначала я обнаружил, что написать программу которая выводит окно и в нём приветствует мир, можно двумя способами. Способ первый: Код:
{код проекта} program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. {код модуля} unit Unit1; interface uses Forms, Controls, StdCtrls, Classes, Buttons; type TForm1 = class(TForm) btn1: TBitBtn; lbl1: TLabel; procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin lbl1.Caption:='Hello, World' end; end. Способ второй: Код:
{код проекта} program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Unit1.Form1.lbl1.Caption:='Hello, World'; Application.Run; end. {код модуля} unit Unit1; interface uses Forms, Controls, StdCtrls, Classes, Buttons; type TForm1 = class(TForm) btn1: TBitBtn; lbl1: TLabel; end; var Form1: TForm1; implementation {$R *.dfm} end. Скажите, какой из этих двух способов, идеалогически более верный? И вот что, в обоих случаях размер конечного exe-файла у меня получается 382Кбайт. Почему так много? Что у меня оказывается в готовом бинарном коде? Ведь я так понимаю, сама программа рисованием на экране окна не занимается, это делает Windows, а программа просто передаёт ей инструкцию, вывести на экран окно и вывести в нём надпись "Hello, World". |
#2
|
||||
|
||||
![]() Цитата:
Код:
uses Forms, Controls, StdCtrls, Classes, Buttons; Также ресурсы: Код:
{$R *.dfm} Последний раз редактировалось ryderx34, 14.03.2011 в 03:01. |
#3
|
||||
|
||||
![]() вообще-то 1 и 2 способы идентичны - они используют всю мощь VCL. из-за этого теряют в размере. на самом деле вот следующий способ, наиболее "многотекстный", но наиболее "малоразмерный" (exe = 15Кб):
Код:
program CreateWindow; uses Windows, Messages; var AWndClass: WNDCLASS; AWnd: HWND; AMsg: TMsg; function WindowProc(AWnd: HWND; Msg: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall; begin case Msg of WM_CREATE: begin Windows.CreateWindow('STATIC', 'Hello, world', WS_CHILD+WS_VISIBLE, 10, 10, 100, 40, AWnd, 0, HInstance, nil); Result:=0; end; WM_DESTROY: begin Result:=0; end; WM_CLOSE: begin PostQuitMessage(0); Result:=0; end; else Result:=DefWindowProc(AWnd, Msg, wParam, lParam); end end; begin AWndClass.Style:=CS_HREDRAW or CS_VREDRAW; AWndClass.lpfnWndProc:=@WindowProc; AWndClass.cbClsExtra:=0; AWndClass.cbWndExtra:=0; AWndClass.hInstance:=HInstance; AWndClass.hIcon:=0; AWndClass.hCursor:=LoadCursor(0, IDC_ARROW); AWndClass.hbrBackground:=HBRUSH(COLOR_WINDOW); AWndClass.lpszMenuName:=nil; AWndClass.lpszClassName:='TWINAPIFORM'; RegisterClass(AWndClass); AWnd:=CreateWindowEx( 0, AWndClass.lpszClassName, AWndClass.lpszClassName, WS_OVERLAPPEDWINDOW, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 320, 120, 0, 0, HInstance, nil); SetWindowText(AWnd, 'MyWinAPIForm'); ShowWindow(AWnd, SW_SHOWNORMAL); UpdateWindow(AWnd); while GetMessage(AMsg, 0, 0, 0) do begin TranslateMessage(AMsg); DispatchMessage(AMsg); end; DestroyWindow(AWnd); UnregisterClass(AWndClass.lpszClassName, HInstance); ExitProcess(0); end. Пишу программы за еду. __________________ |
#4
|
|||
|
|||
![]() Что такое VCL, что за модуль Messages, что за класс WNDCLASS и подскажите какую-нибудь литературу где всё это подробно описано. В моей литературе всё через Forms.
|
#5
|
||||
|
||||
![]() VCL - Visual Component Library, если память мне не изменяет. Это такая вещь, которая сокращает время разработки в столько же раз, насколько увеличивает размер exe
![]() Погугли про WinAPI в Delphi. Если тебе, конечно, это интересно ![]() Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#6
|
|||
|
|||
![]() Искатель, для начала освой визуальное программирование и только потом изучай WinAPI. Любители малых кодов тебе ещё предложат на Ассемблере делать ускорения, а то, что изучение, написание и отладка существенно замедлит создание твоих проектов - об этом задумайся.
Программа на Delphi хоть и начинается с 300К, но потом растёт медленно. Сишники пользуются тем, что основные библиотеки уже есть в Windows и их не надо пристёгивать к проекту. Кстати, переделывал Си-проекты у Адамса (трёхмерная графика DirectX) на Delphi, так у него, напр., еxe-шник 2М, а у меня 500К (код одинаковый). |
#7
|
|||
|
|||
![]() Да, мне это интересно. Я знаю как программировать на Паскале под DOS. Пытался изучить ассемблер, ничего не понял по WinAPI, к тому же не определился MASM или FASM использовать. Сейчас наверное серьёзно возьмусь за Delphi, он вроде наследник Паскаля.
По поводу вопроса. Моя природная любознательность очень хочет знать, что у меня будет в конечном коде. Я так понимаю програмирование через VCL делает то, что в конечный код добавляется множество вызывающих друг друга процедур, которые в конце вызывают всё те же функции WinAPI? Или вы мне советуете сначала изучить визуальное программирование, а только потом такие вопросы задавать. И ещё вопрос, как вообще технически осуществляется вызов функций WinAPI? |
#8
|
|||
|
|||
![]() Цитата:
Итак, прогресс пошёл в таком направлении: Windows, объектное программирование, визуальное программирование. Кратко особенности: 1). В DOS'e алгоритм делал вычисления по порядку. В Windows'е программа большую часть времени ничего не делает (как паук ждёт появления мухи). Пишутся процедуры, назывуемые "обработчики событий" (нажатие кнопки, таймер...). 2). Вводится тип class. Вам надо почитать, что такое экземпляр класса, свойство, методы, события. 3). Многие визуальные компоненты создают прямоугольные окна (кнопки, списки, формы...). Языки визуального программирования вызовы процедур низкого уровня (WinAPI) берут на себя, программисту надо только во время разработки разместить компоненты на форме, установить некоторые свойства, запрограммировать алгоритм в обработчиках (таких как OnClick...). Но конечно, никто не мешает вызывать в любом подходящем месте любую функцию, в том числе и WinAPI. |
#9
|
||||
|
||||
![]() WinApi - это набор функций и процедур расположенных в kernel32.dll, user32.dll, gdi32.dll и т.д. Эти дллки находятся в папке C:\windows\system32\...
У 99% приложений имеется таблица импорта. В ней прописываются имена дллок, ф-нц, процедур которые использует приложение. (можно посмотреть с помощью проги PEExplorer). При обычном программировании на Delphi в прогу пихается куча ненужных ф-нц и т.д. А если на WinApi писать то в прогу пихается де то в половину меньше лишней инфы. На Асме ты сам прописываешь импортируемые функции. WinApi я не изучал я изучил работу и создание длл и всё понял. Нужно только знать для чего какая ф-нц. и в какой длл находится. If end Then begin; |
#10
|
|||
|
|||
![]() Цитата:
Цитата:
В паскале под ДОС есть классы, а так же, есть Object, описание экземпляра класса. Цитата:
Ничего они не создают, создает средство VCL, так как оно предоставляет огромное количество готовых к использованию компонентов. |
#11
|
|||
|
|||
![]() Цитата:
То есть при работе большинства WINDOWS-программ вычисления в основном производятся не в самой программе, а в этих библиотеках? И вот, что мне не понятно, при обрачении к дллкам программа всякий раз грузит их с диска? Как же тогда избежать сбоев, если одновременно несколько процессов пытаются открыть для ыполнения один и тот же файл? Или библиотеки постоянно загружены в оперативную память? Тогда как технически осуществляется обращение к другому процессу находящимуся в оперативной памяти? |
#12
|
|||
|
|||
![]() какие-то постоянно загружены, при загрузке Windows, какие-то сам подгружаешь в своей программе (тебе решать, в памяти будет DLL жить или один раз использовать её и убить из памяти)
взялся из неоткуда, ничего не прошу, помогаю просто так ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя ![]() |