Программирование на C++ глазами хакера

Без окон, без дверей...


Следующий способ уменьшить размер программы заключается в ответе на вопрос: "Из-за чего программа, созданная в Visual C++, получается большой?" Ответ очень прост, C++ является объектным языком. В нем каждый элемент представляет собой объект, который обладает своими свойствами, методами и событиями. Любой объект вполне автономен и многое умеет делать без ваших указаний. Это значит, что вам нужно только подключить его к своей форме, изменить нужным образом свойства, и приложение готово! И оно будет работать без какого-либо прописывания его деятельности.

Но в объектном программировании есть и свои недостатки. В объектах реализовано большое количество действий, которые вы и пользователь сможете производить с ним. Но реально в любой программе мы используем два-три из всех этих свойств. Все остальное — для программы лишний груз, который никому не нужен.

Но как же тогда создать компактный код, чтобы программа занимала минимум места на винчестере и в оперативной памяти? Тут есть несколько вариантов.

Не использовать библиотеку MFC (для любителей Borland Delphi это библиотека VCL ), которая упрощает программирование. В этом случае придется весь код набирать вручную и работать только с WinAPI ( Win dows Application Programming Interface , прикладной программный интерфейс). Программа получается очень маленькой и быстрой. Результирующий код будет меньше, чем при использовании MFC в сочетании с самым большим сжатием. Но таким образом вы лишаетесь простоты визуального программирования и можете ощутить все неудобства программирования с помощью чистого WinAPI.

Для большей оптимизации размера файла можно использовать Assembler , но он слишком сложен, да и писать программу на нем намного дольше, чем даже на чистом С. Именно поэтому данная тема не рассматривается в этой книге.

Сжимать готовые программы с помощью компрессоров. Объектный код сжимается в несколько раз, и программа, созданная с использованием MFC , может превратиться из монстра в 300 Кбайт в скромного по размерам "зверя", занимающего на диске всего 30—50 Кбайт. Главное преимущество состоит в том, что вы не лишаетесь возможностей объектного программирования и можете спокойно забыть про неудобства WinAPI.


Второй метод мы уже обсудили (см. разд. 1.1), поэтому остается только описать первый вариант.

Если вы хотите создать действительно компактную программу, то необходимо забыть про все удобства. Вы не сможете подключать визуальные формы или другие удобные модули, написанные фирмой Microsoft для упрощения жизни программиста. Нельзя использовать классы или компоненты ActiveX. Только функции API самой Windows и ничего больше.

Теперь переходим к практическим занятиям. Запустите Visual C++ и создайте новый проект. Для этого нужно выбрать команду меню File / New / Project (Файл/Новый/Проект). Перед вами откроется окно создания нового проекта ( 1.5). Слева расположено дерево типов проектов. Нас интересует C++, поэтому выберите пункт Visual C++ Projects . Этот пункт мы будем выбирать при написании абсолютно всех примеров из данной книги. С правой стороны в списке Templates (Шаблоны) появятся иконки для создания различных проектов на основе мастеров. Выберете пункт MFC Application (Приложение MFC).

Внизу окна расположены две строки ввода. В первой вы должны указать имя создаваемого проекта. Оно будет использоваться в качестве имени запускаемого файла и имени файла, который вы будете в дальнейшем открывать для редактирования. Давайте здесь укажем TestMFC.



1.5. Настройки программы





1.6. Окно Мастера создания нового проекта

В строке Location (Расположение) нужно указать путь к папке, в которой среда разработки создаст необходимые проекту файлы. Я рекомендую завести свою папку с именем, например, My C++ Projects , в которой будут размещаться все проекты. Выберете эту папку и нажмите ОК. По окончании работы мастера у вас в папке My C++ Projects появится еще одна папка с именем TestMFC , в которой и будут находиться все файлы данного проекта.

Как только вы нажали O К в окне создания нового проекта (см. 1.5), перед вами откроется окно Мастера создания нового MFC -приложения ( 1.6).

Вы можете сразу нажать кнопку Finish, чтобы завершить его работу с параметрами по умолчанию, или предварительно указать свои настройки. Наша задача — создать маленькое приложение, поэтому на данном этапе постараемся оптимизировать то, что может создать для нас мастер.



С левой стороны окна расположены разделы. Выделяя их, вы можете настраивать соответствующие параметры. Давайте просмотрим все разделы и установим необходимые значения, а заодно познакомимся с теми параметрами, которые будут использоваться для создания приложений при рассмотрении последующих примеров:

Application Type (Тип приложения). В этом разделе мы задаем тип создаваемого приложения. Давайте укажем здесь следующие значения:


    Single Document (Документ с одним окном) — нам достаточно будет только одного окна. Многодокументные приложения мы не рассматриваем, поэтому большинство примеров с использованием MFC будет основываться на этом типе приложений или на основе диалоговых окон (Dialog based);

    Project style (Стиль проекта) — во всех приложениях будем использовать стиль по умолчанию (MFC стандарт);

    Document / View architecture support (Поддержка архитектуры Документ/ Просмотр) — это значение нас пока не интересует, поэтому оставим установленное по умолчанию;

    Advanced Features (Дополнительные возможности). В этом разделе в будущем нас будет интересовать только параметр Windows socket (поддержка сокетов Windows), который позволит нам писать примеры для работы с сетью.

    Во всех остальных разделах оставляем значения по умолчанию, потому что мы не будем использовать базы данных или документы. В большинстве случаев нам будет достаточно окна и меню. А первое время постараемся обходиться вообще без MFC .

    Нажмите кнопку Finish , чтобы завершить работу мастера. По завершении его работы вы увидите главное окно среды разработки Microsoft Visual C++, представленное на 1.7. Это окно мы будем использовать достаточно часто, поэтому в процессе работы уточним все детали.



    1.7. Главное окно среды разработки Microsoft Visual C++

    Сейчас нас интересуют параметры проекта. Мы должны отключить все, что нам будет мешать. При сборке проекта в Visual C++ по умолчанию могут использоваться два вида настроек: debug и release . Первый необходим на этапе разработки, и в этом режиме Visual C++ создает запускаемый файл, который содержит слишком много дополнительной информации. Она будет необходима вам в среде разработки в дальнейшем при отладке программы и поиске ошибок. Во втором режиме эта информация отключается, и запускаемый файл будет меньшего размера.



    В верхней части окна на панели с кнопками найдите выпадающий список, в котором написано Debug . Измените это значение на Release .

    Среда разработки Visual C++ может создавать запускаемые файлы, использующие MFC -библиотеки, двух типов: статические и динамические. По умолчанию используется динамическая сборка. В таком режиме запускаемый файл получается меньшего размера, но он не будет работать без динамических библиотек, таких как mfcXXX.dll, где XXX — это номер версии среды разработки.

    В этом случае, чтобы кто-то смог запустить наш проект, мы должны отослать ему не только запускаемый файл, но и библиотеки! Это неудобно и неприлично. Лучше использовать статическую компиляцию, при которой результирующий файл будет намного больше, зато все будет содержать внутри себя. При таком подходе не потребуются дополнительные библиотеки.

    Чтобы изменить тип использования MFC , в окне Solution Explorer сначала выберите имя вашего проекта, а затем меню команду Project/Properties. На 1.8 представлено окно свойств проекта.



    1.8. Окно свойств проекта

    Слева в окне расположены разделы свойств. Нас будет интересовать раздел General (Основные). Выделите его, и в основном окне появится список соответствующих свойств. Найдите свойство Use of MFC и измените его значение на Use of MFC in a Static Library. Нажмите кнопку OK , чтобы закрыть окно и сохранить изменения.

    Теперь соберем наш проект в готовый исполняемый файл. Для этого нужно выбрать команду меню Build/Build solution (Построить/Построить проект). Внизу главного окна (см. 1.7), в панели Output (Вывод) будет появляться информация о ходе сборки. Дождитесь, пока не появится сообщение типа:

    ---------------------- Done ----------------------
    Build : 1 succeeded , 0 failed , 0 skipped

    Теперь перейдите в папку, которую вы выделили под хранение проектов, и найдите там папку TestMFC . В ней расположены файлы с исходным кодом нашего проекта, сгенерированные мастером. Тут же должна быть папка Release , в которой среда разработки создала во время компиляции промежуточные и исполняемый файлы. Выделите файл TestMFC . exe и посмотрите его свойства (надо щелкнуть правой кнопкой мыши и выбрать в появившемся меню пункт Свойства). Размер нашего пустого проекта составляет 386 Кбайт. Это очень много.



    Попробуйте открыть его в программе ASPack и сжать. У меня сжатый исполняемый файл составил 187 Кбайт. Сжатие составило практически 50%, и это уже более или менее приемлемый размер для шуточной программы.

    Примечание
    Пример этой программы вы можете увидеть на компакт-диске в папке /Demo/Chapter1/TestMFC. Чтобы открыть этот пример, выберите команду меню File/Open solution. Перед вами появиться стандартное окно открытия файлов. Перейдите в нужную директорию и выберите файл с именем проекта и расширением vcproj.
    Чтобы сделать программу еще меньше, необходимо отказаться от MFC и писать на чистом С. Это немного сложнее и не так удобно, но для небольших проектов вполне приемлемо.

    Для того чтобы создать маленькую программу без использования MFC, нужно снова использовать меню File/New/Project и здесь выбрать уже тип создаваемого проекта Win32 Project. В качестве имени давайте укажем ctest, a путь оставим тот же.

    Если у вас все еще открыт предыдущий проект, то под строкой ввода пути для проекта есть переключатели: Add to solution (Добавить в решение) и Close solution (Закрыть решение). Если вы выберете первый из них, то текущий проект будет добавлен в уже открытый. Если выбрать закрытие, то текущий проект будет закрыт и для вас будет создано новое рабочее поле.

    После нажатия кнопки O К перед вами откроется окно мастера. Первый шаг чисто информационный, поэтому выберете раздел Application Settings (Настройки приложения). Перед вами откроется окно как на 1.9.

    Нас интересует простое приложение Windows , поэтому вы должны выбрать в разделе Application type (Тип приложения) переключатель Windows application. Больше нигде не надо ставить галочки, чтобы мастер не добавлял ничего лишнего. Нам необходим только самый минимум. Нажмите кнопку Finish, и будет создан новый проект.

    Здесь также нужно изменить Debug на Release, чтобы создать проект без дополнительной информации. В настройках проекта ничего менять не надо, потому что созданный мастером шаблон не использует MFC и ему не нужны динамические библиотеки. Можете зайти в свойства проекта и убедиться, что в свойстве Use of MFC стоит Standard Windows Libraries (использовать стандартные библиотеки Windows). Это значит, что нет MFC, и ничего дополнительного программе не надо, только стандартные библиотеки Windows.





    1.9. Окно настроек приложения

    Попробуйте откомпилировать проект. Для этого выберете команду меню Build/Build solution. По окончании сборки перейдите в папку ctest/Release каталога, где вы создавали проекты, и посмотрите на размер результирующего файла. У меня получился 81 Кбайт. Если сжать файл, то получится менее 70 Кбайт. Вот такая программа уже скопируется по сети достаточно быстро.

    Программу можно еще больше оптимизировать и убрать некоторые вещи, которые не используются, но отнимают драгоценные килобайты, однако мы этого делать не будем.


    Содержание раздела