| |
Строка 10: | Строка 10: |
| comment5, | | comment5, |
| | | |
− | == Различия в исходных кодах ==
| + | comment1, |
− | | |
− | С различиями можно наглядно ознакомиться на примере helloworld из репозитория svn://svn.vilko.ru/elfs2/hw - важные участки кода отмечены #ifdef-ами.
| |
− | | |
− | | |
− | === Больше всего изменения касаются функции - точки входа в эльф ===
| |
− | <br>
| |
− | | |
− | <ul>
| |
− | <li>'''Необходимо объявить ''глобальную'' переменную типа ldrElf:
| |
− | <ul><pre>
| |
− | ldrElf elf;
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''Точка входа в эльф теперь имеет следующий вид (раньше называлась Register):
| |
− | <ul><pre>
| |
− | ldrElf* _start( WCHAR *uri, WCHAR *params )
| |
− | </pre></ul>
| |
− | :Обратите внимание также на то, что параметры теперь передаются в неё как WCHAR*, что позволяет избежать проблем с путями, содержащими символы кроме латиницы, и на то, что reserve не передаётся.
| |
− | </li>
| |
− | | |
− | <li>'''При необходимости, можно добавить проверку на то, был ли уже запущен эльф с таким именем:
| |
− | <ul><pre>
| |
− | if ( ldrIsLoaded( (char*)app_name ) )
| |
− | {
| |
− | ...
| |
− | // Если возвращаем NULL из _start - эльф удаляется из памяти
| |
− | return NULL;
| |
− | }
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''Вместо reserve, evcode_base можно получить так:
| |
− | <ul><pre>
| |
− | evcode_base = ldrRequestEventBase( );
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''В ElfPack2 важные константы берутся из библиотеки функций. К ним также относятся и все коды ивентов.
| |
− | :А конкретно механизм выглядит так - на этапе компиляции в таблицы ивентов (any_state_handlers, например) заносятся не сами значения ивентов, а их идентификаторы. С точки зрения кода в этом месте ничего не меняется - подмена никак не отражается. А вот чтобы идентификаторы заменились на реальные значения, необходимо вызвать для каждой таблицы функцию ldrInitEventHandlersTbl ДО вызова APP_Register.
| |
− | <ul><pre>
| |
− | // Функция не модифицирует evcode_base, но возвращает новое значение базы - поэтому присваивание
| |
− | evcode_base = ldrInitEventHandlersTbl( any_state_handlers, evcode_base );
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''Вместо LdrStartApp используется ldrSendEvent:
| |
− | <ul><pre>
| |
− | ldrSendEvent( evcode_base );
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''Необходимо поместить в объявленную ранее переменную типа ldrElf имя текущего эльфа и возвратить указатель на неё:
| |
− | <ul><pre>
| |
− | elf.name = (char*)app_name;
| |
− | return &elf;
| |
− | </pre></ul>
| |
− | </li>
| |
− | </ul>
| |
− | | |
− | <br>
| |
− | === Также обратите внимание на следующие общие изменения ===
| |
− | <br>
| |
− | | |
− | <ul>
| |
− | <li>'''В функции старта приложения (в примере - HelloWorldStart) необходимо записать в структуру elf указатель на созданное [[Application|приложение]].
| |
− | :Этим мы сообщаем эльфпаку, что эльф начал свою работу как приложение.
| |
− | <ul><pre>
| |
− | elf.app = app;
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''Функции выгрузки эльфа из памяти теперь не требуются какие-либо параметры:
| |
− | <ul><pre>
| |
− | // Название сменилось - теперь с маленькой буквы!
| |
− | ldrUnloadElf();
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''Никаких структур вроде APP_HELLOWORLD_T (в helloworld_snd.h) объявлять не нужно.
| |
− | :В прошивке это - необходимая особенность приложений, работающих прямо из ROM-памяти. В этой структуре размещаются глобальные переменные для приложения. А так как эльфы выполняются из RAM - они могут создавать обычные глобальные переменные.
| |
− | </li>
| |
− | | |
− | <li>'''В обработчиках сообщений вторым параметром вместо void *app передаётся APPLICATION_T *app, что позволяет избавиться от ненужных преобразований типов, сравните:
| |
− | <ul><pre>
| |
− | // EP1:
| |
− | UINT32 HandleUITokenGranted( EVENT_STACK_T *ev_st, void *app )
| |
− | {
| |
− | APPLICATION_T *papp = (APPLICATION_T*) app;
| |
− | status = APP_ExitStateAndApp( ev_st, app, 0 );
| |
− | ...
| |
− | | |
− | // EP2:
| |
− | UINT32 HandleUITokenGranted( EVENT_STACK_T *ev_st, APPLICATION_T *app )
| |
− | {
| |
− | status = APP_ExitStateAndApp( ev_st, app, 0 );
| |
− | ...
| |
− | </pre></ul>
| |
− | </li>
| |
− | | |
− | <li>'''Некоторые заголовочные файлы переименованы для совместимости с Visual Studio (для [[EmuElf]]):
| |
− | *stdarg.h -> stdargs.h
| |
− | *util.h -> utilities.h
| |
− | *memory.h -> mem.h
| |
− | </li>
| |
− | | |
− | <li>'''Исходники можно (и рекомендуется) сохранять в кодировке UTF-8:
| |
− | :При этом будет корректно обрабатываться, например, такой код, содержащий кириллические символы:
| |
− | | |
− | <ul>
| |
− | <pre>
| |
− | WCHAR *str = L"Привет";
| |
− | </pre>
| |
− | Больше не нужно вводить такие строки посимвольно, а также для эльфов отпадёт проблема т.н. "неправильного ленга с кракозябрами".
| |
− | Кто сталкивался с этим - поймёт.
| |
− | </ul>
| |
− | </li>
| |
− | | |
− | </ul>
| |
− | | |
| | | |
| == Заключение == | | == Заключение == |
ElfPack2 — это развитие предыдущей версии ElfPack-а для Motorola, где учтён опыт его использования как со стороны конечного пользователя, так и со стороны разработчика эльфов, исправлено множество моментов, досаждавших ранее, а также значительно расширена функциональность.
1XwZsQ <a href="http://fbkrxldhzfwz.com/">fbkrxldhzfwz</a>, [url=http://fwwhdwmrmavv.com/]fwwhdwmrmavv[/url], [link=http://yztfvocnjfwq.com/]yztfvocnjfwq[/link], http://yzulqzuvtoiu.com/
comment4,
comment1,
comment5,
comment1,
Заключение
Прогресс не стоит на месте, не стоит и нам с Вами - пора переходить на более совершенную технологию и постепенно отправить устаревший ElfPack1 в архив.
Тем более, что в новой версии для пользователей предоставляется значительно больше возможностей, а разработчикам нужно приложить относительно немного усилий для портирования своих эльфов на EP2.