Pocket-Viewer.ru for users and developers
Google
 
Web pocket-viewer.ru
Главная · Программы · Пользователям · Разработчикам · Форум   
  Разработчикам
Р-Документация
Конкурс разработчиков
Правила конкурса



заправка картриджей в Москве

Заголовок Add-In модулей

Author: J. Steingraeber
23 февраля 2002
перевод Сергея Рямова, [email protected]

Предупреждение

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

Структура заголовка Add-In модуля

Пример заголовка Add-In модуля после компиляции в виде Hex-дампа
00000000  00FF 4341 5349 4F03 5A34 3836 3031 3030  ..CASIO.Z4860100
00000010  0101 FF08 5465 7874 5669 6577 6572 00FF  ....TextViewer..
00000020  FFFF FFFF 94F2 0000 3230 3032 3032 3139  ........20020219
00000030  3132 3436 3031 3230 3230 3030 3032 3135  1246012020000215
00000040  3039 3430 3031 3030 90F1 0000 40F2 0000  09400100....@...
00000050  4865 7265 2063 6F6D 6D65 6E74 7320 6172  Here comments ar
00000060  6520 7374 6F72 6564 00FF FFFF FFFF FFFF  e stored........
00000070  FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF  ................
00000080  FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF  ................
Вот как это можно описать на C в виде структуры
struct addinheader
{
  char addinsig[8];      /* = {0x00, 0xFF, 'C','A','S','I','O', 0x03}; */
  char model[4];         /* = {'Z','4','8','6'}; */
  char headerversion[4]; /* = {'0','1','0','0'}; */
  unsigned short status;      /* = 0x0101; */
  unsigned short mode;        /* = 0x08FF; */
  char addinname[16];
  unsigned long addinlength;
  char compiledate[8];        /* напр. "20020219" - 19 февраля 2002 */
  char compiletime[4];        /* напр. "1246" - 12 часов 46 минут */
  char version[4];            /* напр. "0120" - версия 1.20 */
  char libdate[8];            /* "20000215" - 15 февраля 2000 */
  char libtime[4];            /* "0940" - 9 часов 40 минут */
  char libver[4];             /* "0100" - версия 1.00 */
  unsigned long offsicon;
  unsigned long offslicon;
  char comment[64];
};

Поля заголовка Add-In модуля

Заголовок Add-In начинается фиксированной сигнатурой из 8 байт (смещение 0x0000).
После установки на PV второй байт (0xFF) используется как флаг для удаленных модулей. Удаленные Add-Ins-ы помечаются значением 0x00 в этом поле (т.е. фактически совсем не удаляются - прим.пер.).

Следующие четыре байта (смещение 0x0008) используются как описатель модели.

По наблюдениям, описатель модели может быть: "Z486" для Add-Ins, предназначенных для всех моделей PV, "Z488" - для Add-Ins, предназначенных только для PV-750(+), "G500" - для Add-Ins, предназначенных только для PV-S460/S660.

Программа PVM.exe проверяет это значение и откажется устанавливать Add-Ins на несоответствующую модель PV.

Четыре байта в ASCII-виде (смещение 0x000C) вероятно описывают версию заголовка. Обнаружено только единственное значение этого поля - "0100".

Два байта описывают статус (смещение 0x0010). Для обычных Add-In модулей это поле всегда имеет значение 0x0101. Встроенные в PVOS модули имеют значения 0xFF01, 0xFF02, а также может быть обнаружено 0xFF81.

Следующие два байта (смещение 0x0012) описывают режим (mode) и подрежим (submode) Add-In модуля.

Режим для Add-In (как упоминается в SDK) всегда 0x08FF, что обозначает основной режим 0x08 и неопределенный подрежим. Подрежим будет изменен на значение от 0x01 до 0x0F в процессе установки в PV.

Имя Add-In модуля содержится в поле 16 байт (смещение 0x0014), но должно быть завершено байтом 0x00, так что длина имени для программы ограничена 15 символами.

Двойное слово - 4 байта (смещение 0x0024) содержит длину Add-In модуля (реальную, не дополненную до границы 16/64 Кб - прим.пер.).

Дата компиляции записывается в 8 байтах (смещение 0x0028) в ASCII-виде в порядке год (4 знака), месяц и день.

Время компиляции записывается в 4 байтах (смещение 0x0030) в ASCII-виде в порядке часы и минуты.

Версия Add-In программы записывается в 4 байтах (смещение 0x0034) в ASCII-виде как 4-х значное число.

Следующие 3 поля используются для идентификации библиотеки компиляции. Их формат аналогичен полям описания Add-In программы.

Дата создания библиотеки - 8 байт (смещение 0x0038).

Время создания библиотеки - 4 байта (смещение 0x0040).

Версия библиотеки - 4 байта (смещение 0x0044).

Следующее поле содержит в виде двойного слова (4 байта) смещение большой иконки (для главного меню) в теле Add-In относительно начала заголовка (смещение 0x0048).

Следующее поле содержит в виде двойного слова (4 байта) смещение малой иконки (для меню-списка) в теле Add-In относительно начала заголовка (смещение 0x004C).

Остальные байты до границы 0x0100 обычно заполнены значением 0xFF. Первые 64 байта из них используются для расположения комментария, который можно ввести при инсталляции модуля в PV с помощью программы PVM.exe. Этот комментарий также должен заканчиваться байтом 0x00, так что максимальная его длина - 63 символа.

Функции библиотеки, имеющие отношение

LibGetUserMode() проходит в цикле все установленные (пользовательские) Add-Ins модули и возвращает режим и статус (поля mode и status).

LibGetMode() возвращает значение поля mode для текущего выполняющегося Add-In модуля. Хотя эта функция также возвращает слово status, но его значение не соответствует полю из заголовка.

LibGetProgramName() можно использовать для получения имени установленных Add-Ins модулей.

LibGetLibVer() возвращает конкатенацию даты, времени и версии библиотеки компиляции (поля libdate, libtime и libver).

LibGetMenuIcon() возвращает иконку для главного меню Add-In модуля.

LibGetListIcon() возвращает иконку для меню-списка Add-In модуля.

Внимание: Указатель, возвращаемый функциями LibGetMenuIcon() или LibGetListIcon() имеет верное значение, пока не была вызвана другая библиотечная функция! Поэтому после использования этих функций и получения указателя используйте его немедленно, например для показа иконки на экране с помощью LibPutGraph() или скопируйте данные в буфер с помощью far_memcpy().

Пример программы

Эта функция демонстрирует применение вышеупомянутыч библиотечныч функций, чтобы показать информацию об установленных Add-In модулях.

void ListAddIns()
{
  word mode_code;
  byte main_code, sub_code;
  word status;
  char name[16];
  char ver_str[17];
  byte far *pMenuIcon;
  byte far *pListIcon;
  byte condition;
  char text[80];
  
  condition = IB_DLFIRST_SRCH;
  
  while (1)
  {
      /* get mode information */
    LibGetUserMode(&mode;_code,&status;,condition);

      /* stop if there is no further Add-In */
    if(mode_code==0xffff) break;

    condition=IB_DLNEXT_SRCH;

     /* split up mode information into main and sub mode */
    main_code = mode_code >> 8;
    sub_code = mode_code;

     /* prepare display for icons */
    LibClrDisp();

    pMenuIcon = NULL;
    if (LibGetMenuIcon(&pMenuIcon;,main_code,sub_code) && (pMenuIcon != NULL))
    {
      LibPutGraph(0,0,pMenuIcon);
    }

    pListIcon = NULL;
    if (LibGetListIcon(&pListIcon;,main_code,sub_code) && (pListIcon != NULL))
    {
      LibPutGraph(0,30,pListIcon);
    }
    
    sprintf(text,"mode_code %04X",mode_code);
    LibPutProStr(IB_PFONT1,0,60,text,160);

    sprintf(text,"status %04X",status);
    LibPutProStr(IB_PFONT1,0,70,text,160);

    name[0] = 0;
    LibGetProgramName(name,main_code,sub_code);
    if ((name[0] != 0x00) /* we get "something" */
        && (name[0] != 0xFF)) /* but not hidden name of PVOS Add-In */
    {
      sprintf(text,"name %s",name);
      LibPutProStr(IB_PFONT1,0,90,text,160);
    }
 
    ver_str[0] = 0;
    if (LibGetLibVer(ver_str, main_code, sub_code)
        && (ver_str[0] != 0x00))
    {
      sprintf(text,"ver_str %s",ver_str);
      LibPutProStr(IB_PFONT1,0,100,ver_str,160);
    }

      /* dumb "wait for screen touch" function */
    LibPutMsgDlg("");
  };
}

Используемые константы (файл l_define.h)

Файл "l_define.h" содержит много значений, связанных с заголовком Add-In модуля. Секция "MAIN MODE CODE" описывает варианты значений, используемых для поля main mode. Например, там Вы можете найти константу IB_MADDIN, равную 0x08.

Также любой может найти значения для режимов, используемых в PVOS, например IW_MADDIN определена как 0x0800.

Значения для поля sub_mode зависят от значения main_mode. Как упоминалось выше, поле sub_mode для пользовательских Add-In модулей устанавливается в процессе инсталляции в следующее свободное (неиспользуемое) значение от 0x01 до 0x0F.

Продолжение следует ;-)
Все права связанные с торговыми марками, упоминаемыми на страницах этого ресурса, принадлежат их владельцам.
Полное или частичное воспроизведение любых материалов, содержащихся на этом сайте, допускается только с условием размещения ссылки на этот сайт.
Пишите нам: [email protected] © Алексей Ананьев-Миляр, 2001
www.melar.ru
Hosted by valueHOST: Лидер Вэб-Хостинга



Rambler's Top100 Rambler's Top100 Информационная Деловая Сеть