comment5,
== Различия в исходных кодах == С различиями можно наглядно ознакомиться на примере 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 *uricomment1, 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>
== Заключение ==