Полный исходный текст на языке C++ для библиотеки (DLL) с моделями блоков с мигающими изображениями. Библиотека содержит две модели:
- SimpleFlash – модель, не устойчивая к постоянному перезапуску по входу Flash;
- SimpleFlashEx – устойчивая к перезапуску модель (изменения выделены цветом).
// Блок, мигающий по таймеру в режиме расчета #include <windows.h> #include <RdsDef.h> // Подготовка описаний сервисных функций #define RDS_SERV_FUNC_BODY GetInterfaceFunctions #include <RdsFunc.h> //========== Главная функция DLL ========== int WINAPI DllMain(HINSTANCE /*hinst*/, unsigned long reason, void* /*lpReserved*/) { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL { // Получение доступа к функциям RDS if(!GetInterfaceFunctions()) RDS_SERV_ERROR_MSGW // Сообщение: старая версия RDS } return 1; } //========= Конец главной функции ========= //====== Модель простого мигающего блока ====== // (первый вариант - неустойчив к постоянному перезапуску по входу Flash) extern "C" __declspec(dllexport) int RDSCALL SimpleFlash( int CallMode, RDS_PBLOCKDATA BlockData, LPVOID 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))) // Вспомогательная переменная – указатель на личную область // В личной области хранится только идентификатор таймера RDS_TIMERID *data=(RDS_TIMERID*)(BlockData->BlockData); switch(CallMode) { // Инициализация блока case RDS_BFM_INIT: // Отводим место для хранения идентификатора таймера BlockData->BlockData=data=new RDS_TIMERID; // Создаем таймер, интервал пока не устанавливаем *data=rdsSetBlockTimer(NULL,0, RDS_TIMERM_LOOP|RDS_TIMERS_TIMER,FALSE); break; // Очистка данных блока case RDS_BFM_CLEANUP: // Уничтожаем таймер rdsDeleteBlockTimer(*data); // Освобождаем память, где он хранился delete data; break; // Проверка типа статических переменных case RDS_BFM_VARCHECK: if(strcmp((char*)ExtParam,"{SSLL}")) return RDS_BFR_BADVARSMSG; return RDS_BFR_DONE; // Такт расчета case RDS_BFM_MODEL: if(Flash) // Включаем мигание { // Запускаем таймер с интервалом 500 мс rdsRestartBlockTimer(*data,500); // Сразу "зажигаем" изображение блока State=1; } else // Выключаем мигание { // Останавливаем таймер rdsStopBlockTimer(*data); // "Гасим" изображение блока State=0; } break; // Срабатывание таймера case RDS_BFM_TIMER: // Инвертируем состояние State=!State; break; } return RDS_BFR_DONE; // Отмена макроопределений для переменных #undef State #undef Flash #undef Ready #undef Start #undef pStart } //================================================= //====== Модель простого мигающего блока ====== // (второй вариант - устойчив к постоянному перезапуску по входу Flash) extern "C" __declspec(dllexport) int RDSCALL SimpleFlashEx( int CallMode, RDS_PBLOCKDATA BlockData, LPVOID 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))) // Вспомогательная переменная – указатель на личную область // В личной области хранится только идентификатор таймера RDS_TIMERID *data=(RDS_TIMERID*)(BlockData->BlockData); // Структура описания таймера RDS_TIMERDESCRIPTION descr; switch(CallMode) { // Инициализация блока case RDS_BFM_INIT: // Отводим место для хранения идентификатора таймера BlockData->BlockData=data=new RDS_TIMERID; // Создаем таймер, интервал пока не устанавливаем *data=rdsSetBlockTimer(NULL,0, RDS_TIMERM_LOOP|RDS_TIMERS_TIMER,FALSE); break; // Очистка данных блока case RDS_BFM_CLEANUP: // Уничтожаем таймер rdsDeleteBlockTimer(*data); // Освобождаем память, где он хранился delete data; break; // Проверка типа статических переменных case RDS_BFM_VARCHECK: if(strcmp((char*)ExtParam,"{SSLL}")) return RDS_BFR_BADVARSMSG; return RDS_BFR_DONE; // Такт расчета case RDS_BFM_MODEL: // Запрашиваем параметры таймера descr.servSize=sizeof(descr); rdsGetBlockTimerDescr(*data,&descr); if(Flash) // Включаем мигание, если таймер остановлен { if(!descr.On) // Таймер остановлен { rdsRestartBlockTimer(*data,500); State=1; } } else // Выключаем мигание, если таймер работает { if(descr.On) // Таймер работает { rdsStopBlockTimer(*data); State=0; } } break; // Срабатывание таймера case RDS_BFM_TIMER: // Инвертируем состояние State=!State; break; } return RDS_BFR_DONE; // Отмена макроопределений для переменных #undef State #undef Flash #undef Ready #undef Start #undef pStart } //=================================================