Навигация:
<< >> Оглавление Указатель
Текст С++

Полный исходный текст на языке C++ для библиотеки (DLL) с моделями блоков с мигающими изображениями. Библиотека содержит две модели:

  // Блок, мигающий по таймеру в режиме расчета
  #include <windows.h>
  #include <RdsDef.h>
  // Подготовка описаний сервисных функций
  
  #include <RdsFunc.h>

  //==========  ==========
  int WINAPI ( /*hinst*/,
                           unsigned long reason,
                           void* /*lpReserved*/)
  { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL
      { // Получение доступа к функциям RDS
        if(!GetInterfaceFunctions())
           // Сообщение: старая версия RDS
      }
    return 1;
  }
  //========= Конец главной функции =========

  //====== Модель простого мигающего блока ======
  // (первый вариант - неустойчив к постоянному перезапуску по входу Flash)
  extern "C" __declspec(dllexport) int  SimpleFlash(
          int CallMode,
           BlockData,
           ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define Flash (*((char *)(pStart+2*RDS_VSZ_S)))
  #define State (*((char *)(pStart+2*RDS_VSZ_S+RDS_VSZ_L)))
    // Вспомогательная переменная – указатель на личную область
    // В личной области хранится только идентификатор таймера
     *data=(*)(BlockData->BlockData);

    switch(CallMode)
      { // Инициализация блока
        case :
          // Отводим место для хранения идентификатора таймера
          BlockData->BlockData=data=new ;
          // Создаем таймер, интервал пока не устанавливаем
          *data=(NULL,0,
                  |,FALSE);
          break;

        // Очистка данных блока
        case :
          // Уничтожаем таймер
          (*data);
          // Освобождаем память, где он хранился
          delete data;
          break;

        // Проверка типа статических переменных
        case :
          if(strcmp((char*)ExtParam,"{SSLL}"))
            return ;
          return ;

        // Такт расчета
        case :
          if(Flash) // Включаем мигание
            { // Запускаем таймер с интервалом 500 мс
              (*data,500);
              // Сразу "зажигаем" изображение блока
              State=1;
            }
          else // Выключаем мигание
            { // Останавливаем таймер
              (*data);
              // "Гасим" изображение блока
              State=0;
            }
          break;

        // Срабатывание таймера
        case :
          // Инвертируем состояние
          State=!State;
          break;
      }
    return ;
  // Отмена макроопределений для переменных
  #undef State
  #undef Flash
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=================================================

  //====== Модель простого мигающего блока ======
  // (второй вариант - устойчив к постоянному перезапуску по входу Flash)
  extern "C" __declspec(dllexport) int  SimpleFlashEx(
          int CallMode,
           BlockData,
           ExtParam)
  {
  // 
  #define pStart ((char *)(BlockData->VarTreeData))
  #define Start (*((char *)(pStart)))
  #define Ready (*((char *)(pStart+RDS_VSZ_S)))
  #define Flash (*((char *)(pStart+2*RDS_VSZ_S)))
  #define State (*((char *)(pStart+2*RDS_VSZ_S+RDS_VSZ_L)))
    // Вспомогательная переменная – указатель на личную область
    // В личной области хранится только идентификатор таймера
     *data=(*)(BlockData->BlockData);
    // Структура описания таймера  
     descr;    

    switch(CallMode)
      { // Инициализация блока
        case :
          // Отводим место для хранения идентификатора таймера
          BlockData->BlockData=data=new ;
          // Создаем таймер, интервал пока не устанавливаем
          *data=(NULL,0,
                  |,FALSE);
          break;

        // Очистка данных блока
        case :
          // Уничтожаем таймер
          (*data);
          // Освобождаем память, где он хранился
          delete data;
          break;

        // Проверка типа статических переменных
        case :
          if(strcmp((char*)ExtParam,"{SSLL}"))
            return ;
          return ;

        // Такт расчета
        case :
          // Запрашиваем параметры таймера      
          descr.servSize=sizeof(descr);         
          (*data,&descr);  
          if(Flash) // Включаем мигание, если таймер остановлен
            { if(!descr.On) // Таймер остановлен 
                { (*data,500);
                  State=1;
                }
            }
          else // Выключаем мигание, если таймер работает
            { if(descr.On) // Таймер работает 
                { (*data);
                  State=0;
                }
            }
          break;

        // Срабатывание таймера
        case :
          // Инвертируем состояние
          State=!State;
          break;
      }
    return ;
  // Отмена макроопределений для переменных
  #undef State
  #undef Flash
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=================================================


<< >> Оглавление Указатель