Полный исходный текст на языке C++ для библиотеки (DLL) с моделью блока, сохраняющего параметры в текстовом формате, аналогичном формату INI-файлов. Изменения относительно предыдущей версии этой модели, соханявшей данные в двоичном формате, выделены цветом.
// Сохранение параметров блока в формате INI-файла #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); // Функция настройки параметров void SaveText(void); // Функция записи параметров void LoadText(char *text); // Функция загрузки параметров TTest1Data(void) // Конструктор класса { IParam=0; DParam=0.0; rdsMessageBox("Область создана","TTest1Data",MB_OK); }; ~TTest1Data() // Деструктор класса { rdsMessageBox("Область удалена","TTest1Data",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;// Запись параметров в текстовом формате case RDS_BFM_SAVETXT: data=(TTest1Data*)(BlockData->BlockData); data->SaveText(); break; // Загрузка параметров в текстовом формате case RDS_BFM_LOADTXT: data=(TTest1Data*)(BlockData->BlockData); data->LoadText((char*)ExtParam); 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; } //=========================================// Функция сохранения параметров void TTest1Data::SaveText(void) { RDS_HOBJECT ini; // Вспомогательный объект // Создание объекта для работы с образом INI-файла ini=rdsINICreateTextHolder(TRUE); // Создание новой секции "General" rdsSetObjectStr(ini,RDS_HINI_CREATESECTION,0,"General"); // Запись двух параметров блока rdsINIWriteInt(ini,"IParam",IParam); rdsINIWriteDouble(ini,"DParam",DParam); // Передача сформированного в объекте текста в RDS для записи rdsCommandObject(ini,RDS_HINI_SAVEBLOCKTEXT); // Удаление объекта rdsDeleteObject(ini); } //========================================= /* // Функция сохранения параметров – упрощенный вариант, ухудшена читаемость и // затруднено внесение изменений void TTest1Data::SaveText(void) { char buffer[1024]; // Буфер для формирования текста // Формирование текста в буфере при помощи функции sprintf sprintf(buffer, "[General]\nIParam=%d\nDParam=%lf", IParam,DParam); // Передача сформированного текста в RDS rdsWriteBlockDataText(buffer,FALSE); } //========================================= */ // Функция загрузки параметров void TTest1Data::LoadText(char *text) { RDS_HOBJECT ini; // Вспомогательный объект // Создание объекта для работы с образом INI-файла ini=rdsINICreateTextHolder(TRUE); // Передача в объект текста, полученного из RDS rdsSetObjectStr(ini,RDS_HINI_SETTEXT,0,text); // Установить текущую секцию if(rdsINIOpenSection(ini,"General")) { // Такая секция есть в тексте – считать из нее параметры IParam=rdsINIReadInt(ini,"IParam",0); DParam=rdsINIReadDouble(ini,"DParam",0.0); } // Удаление объекта rdsDeleteObject(ini); } //=========================================