Чтение онлайн

на главную

Жанры

Программирование для карманных компьютеров

Волков Владимир

Шрифт:

Теперь нужно проанализировать реальный код, который приведен в листинге 4.31. Листинг 4.31

/* Если имя __NEWRES_H__ не определено, */

#ifndef __NEWRES_H__

/* Определяем это имя и расширяем текст модуля */

#define __NEWRES_H__

[текст модуля]

#endif //__NEWRES_H__

Если имя __NEWRES_H__ уже было определено в какой-то части программы, то повторной вставки модуля в текст не последует. Такой прием используется для предотвращения многократного расширения в тексте программы одного и того же модуля, на который оказалось несколько ссылок директивы #include. Также этот механизм предотвращает ситуацию, когда два модуля оказались взаимно включены друг в друга. Это вполне возможно в сложных программах, где включаемые модули в свою очередь тоже содержат директивы #include.

Директива #undef удаляет объявление

имени, сделанное при помощи директивы #define.

Редко используемая директива #line позволяет изменить нумерацию строк и имя файлов, выводимых макросами____ LINE__ и___ FILE__.

Директива #import предназначена для вставки в текущий файл импортированной из соответствующей библиотеки типов информации. Например, директива

#import..\office\office.olb

вставит описание интерфейсов из файла office.olb в текущий файл.

Директива #pragma позволяет вставлять в текст модулей директивы, свойственные только данной платформе или операционной системе. У каждого компилятора для каждой операционной системы свой набор директив #pragma.

Функции

Функции main и WinMain

Функции в C++ являются краеугольным камнем всей концепции программирования. Собственно говоря, функции как раз и выполняют всю работу, которую запланировал для своего приложения разработчик. Само выполнение программы, написанной на С++, начинается с вызова специальной функции. Для консольных приложений это будет функция main О, для приложений Windwos – WinMainO. Модуль, в котором определена эта функция, и является основным модулем программы.

У консольного приложения со стандартным ходом выполнения программы все остальные функции вызываются из функции mainO, и когда все определенные в mainO функции вызваны, завершается выполнение основной функции, а вместе с ней завершается и выполнение программы.

У приложения Windows сценарий работы программы выглядит иначе. Управление программой осуществляется не вызовами функций из основной функции WinMainO, а выполнением обработчиков событий. Запущенное приложение работает до тех пор, пока не получит сообщение WM_QUIT, сигнализирующее о том, что приложению следует закончить работу.

Синтаксис объявления функции WinMain приведен ниже.

int WINAPI WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPWSTR lpCmdLine,

int nShowCmd);

Параметры функции рассматриваются в следующем списке.

? hlnstance – уникальный идентификатор запускаемого экземляра приложения.

? hPrevInstance – уникальный идентификатор предыдущего запущенного экземпляра приложения. Для Pocket PC этот параметр всегда имеет значение NULL.

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

? nShowCmd – целочисленная константа, определяющая, как именно основное окно приложения будет показано после запуска. Ее возможные значения перечислены в табл. 4.5.

Таблица 4.5. Параметры запуска приложения

В качестве возвращаемого значения функция WinMainO возвращает целочисленную константу, переданную ей как wParam сообщения WM_QUIT.

Объявление и реализация функций

В стандарте C++ для того, чтобы объявить и реализовать функцию, необходимо разместить как объявление функции, так и реализацию. Реализация и прототип отличаются друг от друга только наличием тела функции, другими словами, реализация – это прототип с телом функции.

Однако при компиляции приложений в eVC по умолчанию правила не так строги, и разработчик может использовать функции как с объявлением прототипа, так и без него.

Упражнение 4.7 (продолжение)

5. В файл advance.срр необходимо внести некоторые изменения. Так, в коде функции WndProc, в блоке обработки сообщения IDM_HELP_ABOUT нужно закрыть комментариями имеющийся код, и добавить одну строку.

MessageBox(hWnd, MyFunk1, TEXT("MAMA "), 0);

Этот код выводит на экран сообщение, текст которого будет получен как возвращаемое значение функции MyFunkK).

6. Сразу после функции WndProc объявить и определить функцию MyFunkl, как показано в листинге 4.32.

Листинг 4.32

LPCTSTR MyFunk1{

return (LPCTSTR)TEXT(«MUMU»);

}

7. Запустить программу на выполнение.

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

LPCTSTR MyFunk1;

8. После установки прототипа перед вызовом функции MyFunkl компиляция будет проходить нормально. Проект будет запущен, и при выполнении команды меню Tools ? About на экран будет выведено сообщение MUMU.

9. Теперь нужно усложнить пример, чтобы показать, как происходит объявление и вызов функции из другого модуля. Для этого нужно добавить к проекту еще один файл исходного кода (File ? New ? Files ? C++ Source File) с именем modl.cpp. Помимо него потребуется еще один заголовочный файл (File ? New ? Files ? С\С++ Header File) с именем modl.h.

10. В файле modl.h нужно объявить новую функцию, как это показано в листинге 4.33.

Листинг 4.33

#ifndef __MOD1_H__

#define __MOD1_H__

LPCTSTR MyFunk2(int x, LPCTSTR y);

#endif //__MOD1_H__

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

11. В файле modl.cpp написать реализацию этой функции, как это показано в листинге 4.34.

Листинг 4.34

#include «stdafx.h»

#include «mod1.h»

#include <string.h>

wchar_t strA[512];

wchar_t strB[5];

wchar_t *str1 = strA;

wchar_t *str2 = strB;

LPCTSTR MyFunk2(int x, LPCTSTR y){

str2 = wcscpy(str2, y);

for (int i = 0; i<x; i++){

wcscat(str1, str2);

wcscat(str1, TEXT(" "));

}

return LPCTSTR(str1);

};

12. Чтобы данную функцию можно было вызвать из основного модуля программы advance.срр, в него надо включить ссылку на файл modl.h, сделав это в начале кода, как это показано в листинге 4.35. Листинг 4.35

#include «stdafx.h»

#include «advance.h»

#include «mod1.h»

13. И, наконец, надо вызвать эту функцию. Для этого нужно изменить реализацию функции MyFunkl, как это показано в листинге 4.36. Листинг 4.36

LPCTSTR MyFunk1{

return (LPCTSTR)MyFunk2(25, (LPCTSTR)TEXT(«MUMU»));

}

14. Запущенная программа теперь выведет в сообщении слово MUMU 25 раз. Спецификаторы extern и static

По умолчанию функции, объявленные без спецификатора, считаются объявленными со спецификатором extern. Это значит что объявления LPCTSTR MyFunkK) и extern LPCTSTR MyFunkK) идентичны. Несмотря на это явное написание спецификатора extern не приветствуется.

Спецификатор extern подразумевает, что объявление функции будет видно из любого другого файла. То есть подобную функцию можно будет использовать во всех модулях проекта.

Второй спецификатор stati с, который следует указывать явно, ограничивает видимость функции тем файлом, в котором она была объявлена.

Поставка приложений

В отличие от среды eVB, в которой есть удобный инструмент Application Install Wizard, в среде eVC подобного мастера нет. Тем не менее в состав Pocket PC SDK входит инструмент, позволяющий создавать поставочные комплекты приложений, разработанных в eVC. В каталоге C: \Windows СЕ Tools\wce300\Pocket PC 2002\ support\ActiveSync\windows се application installation находится программа CabWiz.exe с примером поставочного приложения и конфигурационными файлами. Изменяя эти конфигурационные файлы в соответствии с конфигурацией вашего приложения, можно создать его поставочный вариант.

Механизм поставки приложений для Pocket PC включает в себя три основных программы.

? CAB Wizard – приложение, которое создает дистрибутив (CAB-файл) на настольном компьютере.

? Application Manager – один из компонентов ActiveSync, который предоставляет возможность управлять инсталляцией и удалением приложений на Pocket PC с настольного компьютера.

? WCELoad – программа, которая находится на Pocket PC и предназначена для распаковки установочного комплекта, установки файлов на Pocket PC и регистрации установочной информации и информации, необходимой для корректного удаления программы.

Поделиться:
Популярные книги

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Провинциал. Книга 6

Лопарев Игорь Викторович
6. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 6

Эфир. Терра 13

Скабер Артемий
1. Совет Видящих
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эфир. Терра 13

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Темный Патриарх Светлого Рода 3

Лисицин Евгений
3. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 3

Великий князь

Кулаков Алексей Иванович
2. Рюрикова кровь
Фантастика:
альтернативная история
8.47
рейтинг книги
Великий князь

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Вторая невеста Драконьего Лорда. Дилогия

Огненная Любовь
Вторая невеста Драконьего Лорда
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Вторая невеста Драконьего Лорда. Дилогия

Мир-о-творец

Ланцов Михаил Алексеевич
8. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Мир-о-творец

Невеста вне отбора

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
7.33
рейтинг книги
Невеста вне отбора

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Мимик нового Мира 8

Северный Лис
7. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 8

Утопающий во лжи 3

Жуковский Лев
3. Утопающий во лжи
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Утопающий во лжи 3