Полный исходный текст на языке C++ для библиотеки (DLL) с моделями преобразования числа в строку и сложения строк. Библиотека содержит два варианта модели:
- с отведением памяти вручную функцией rdsAllocate;
- с автоматическим отведением памяти при сложении строк функцией rdsDynStrCat.
// Преобразование числа в строку и сложение строк #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; } //========= Конец главной функции ========= //========================================== // Первый вариант - память отводится вручную //========================================== //============= Модель блока ============== extern "C" __declspec(dllexport) int RDSCALL TestIntStr(int CallMode, RDS_PBLOCKDATA BlockData, LPVOID ExtParam) { // Макроопределения для статических переменных #define pStart ((char *)(BlockData->VarTreeData)) #define Start (*((char *)(pStart))) #define Ready (*((char *)(pStart+RDS_VSZ_S))) #define prefix (*((char **)(pStart+2*RDS_VSZ_S))) #define val (*((RDSINT32 *)(pStart+2*RDS_VSZ_S+RDS_VSZ_A))) #define str (*((char **)(pStart+2*RDS_VSZ_S+RDS_VSZ_A+RDS_VSZ_I))) char buf[40]; // Буфер, в котором формируется строка int l1,l2; switch(CallMode) { // Проверка типа переменных case RDS_BFM_VARCHECK: if(strcmp((char*)ExtParam,"{SSAIA}")==0) return RDS_BFR_DONE; return RDS_BFR_BADVARSMSG; // Выполнение такта моделирования case RDS_BFM_MODEL: // Преобразование числа val в строку buf itoa(val,buf,10); // Определение длин строк prefix и buf l1=prefix==NULL?0:strlen(prefix); l2=strlen(buf); // Освобождение прежнего значения str rdsFree(str); // Отведение памяти под новую строку str=(char*)rdsAllocate(l1+l2+1); // Занесение строки в отведенную память if(prefix!=NULL) // Строка prefix не пуста { strcpy(str,prefix); // Копировать prefix strcat(str,buf); // Дописать buf } else // Строка prefix пуста strcpy(str,buf); // Копировать buf break; } return RDS_BFR_DONE; // Отмена макроопределений #undef str #undef val #undef prefix #undef Ready #undef Start #undef pStart } //========================================= //============================================================== // Второй вариант - использование сервисной функции rdsDynStrCat //============================================================== //============= Модель блока ============== extern "C" __declspec(dllexport) int RDSCALL TestIntStr1(int CallMode, RDS_PBLOCKDATA BlockData, LPVOID ExtParam) { // Макроопределения для статических переменных #define pStart ((char *)(BlockData->VarTreeData)) #define Start (*((char *)(pStart))) #define Ready (*((char *)(pStart+RDS_VSZ_S))) #define prefix (*((char **)(pStart+2*RDS_VSZ_S))) #define val (*((RDSINT32 *)(pStart+2*RDS_VSZ_S+RDS_VSZ_A))) #define str (*((char **)(pStart+2*RDS_VSZ_S+RDS_VSZ_A+RDS_VSZ_I))) char buf[40]; // Буфер, в котором формируется строка switch(CallMode) { // Проверка типа переменных case RDS_BFM_VARCHECK: if(strcmp((char*)ExtParam,"{SSAIA}")==0) return RDS_BFR_DONE; return RDS_BFR_BADVARSMSG; // Выполнение такта моделирования case RDS_BFM_MODEL: // Преобразование числа в строку itoa(val,buf,10); // Освобождение прежнего значения str (str); // Формирование выходной строки str=rdsDynStrCat(prefix,buf,TRUE); break; } return RDS_BFR_DONE; // Отмена макроопределений #undef str #undef val #undef prefix #undef Ready #undef Start #undef pStart } //=========================================