Полный исходный текст на языке C++ для библиотеки (DLL) с моделью блока, сохраняющего параметры в двоичном формате. Изменения относительно предыдущей версии этой модели выделены цветом.
// Сохранение параметров в двоичном формате #include <windows.h> #include <math.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; } //========= Конец главной функции ========= //========================================= //= Пример блока с личной областью данных = //========================================= //====== Класс личной области данных ====== class TTest1Data { public: int IParam; // Целый параметр double DParam; // Вещественный параметр int Setup(void); // Функция настройки параметров TTest1Data(void) // Конструктор класса { IParam=0; DParam=0.0; rdsMessageBoxW(L"Область создана",L"TTest1Data",MB_OK); }; ~TTest1Data() // Деструктор класса { rdsMessageBoxW(L"Область удалена","LTTest1Data",MB_OK);}; }; //========================================= //============= Модель блока ============== extern "C" __declspec(dllexport) int RDSCALL Test1(int CallMode, // Режим вызова (событие в RDS) RDS_PBLOCKDATA BlockData, // Структура данных блока LPVOID /*ExtParam*/) // Доп.параметр (здесь не используется) { TTest1Data *data; switch(CallMode) { case RDS_BFM_INIT: // Инициализация BlockData->BlockData=new TTest1Data(); break; case RDS_BFM_CLEANUP: // Очистка data=(TTest1Data*)(BlockData->BlockData); delete data; break; case RDS_BFM_SETUP: // Функция настройки data=(TTest1Data*)(BlockData->BlockData); return data->Setup(); case RDS_BFM_SAVEBIN: // Сохранение параметров в двоичном формате data=(TTest1Data*)(BlockData->BlockData); rdsWriteBlockData(&(data->IParam),sizeof(data->IParam)); rdsWriteBlockData(&(data->DParam),sizeof(data->DParam)); break; case RDS_BFM_LOADBIN: // Загрузка параметров в двоичном формате data=(TTest1Data*)(BlockData->BlockData); rdsReadBlockData(&(data->IParam),sizeof(data->IParam)); rdsReadBlockData(&(data->DParam),sizeof(data->DParam)); break; } return RDS_BFR_DONE; } //========================================= // Функция настройки параметров // ВАЖНО: Исходный текст программы должен быть записан в UTF8, // в противном случае необходимо использовать версии функций // с суффиксом "W" и символьные константы с префиксом "L" int TTest1Data::Setup(void) { RDS_HOBJECT window; // Идентификатор вспомогательного объекта BOOL ok; // Пользователь нажал "OK" // Создание окна window=rdsFORMCreate(FALSE,-1,-1,"Ввод параметров"); // Добавление полей ввода rdsFORMAddEdit(window,0,1,RDS_FORMCTRL_EDIT, "Целый параметр:",80); rdsFORMAddEdit(window,0,2,RDS_FORMCTRL_EDIT, "Вещественный параметр:",80); // Занесение исходных значений в поля ввода rdsSetObjectInt(window,1,RDS_FORMVAL_VALUE,IParam); rdsSetObjectDouble(window,2,RDS_FORMVAL_VALUE,DParam); // Открытие окна ok=rdsFORMShowModalEx(window,NULL); if(ok) { // Нажата кнопка OK - запись параметров обратно в блок IParam=rdsGetObjectInt(window,1,RDS_FORMVAL_VALUE); DParam=rdsGetObjectDouble(window,2,RDS_FORMVAL_VALUE); } // Уничтожение окна rdsDeleteObject(window); // Возвращаемое значение return ok?RDS_BFR_MODIFIED:RDS_BFR_DONE; } //=========================================