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

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

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

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


  //==========================================
  // Первый вариант - память отводится вручную
  //==========================================

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
    int  TestIntStr(int CallMode,
                          BlockData,
                          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 :
          if(strcmp((char*)ExtParam,"{SSAIA}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          // Преобразование числа val в строку buf
          itoa(val,buf,10);
          // Определение длин строк prefix и buf
          l1=prefix==NULL?0:strlen(prefix);
          l2=strlen(buf);
          // Освобождение прежнего значения str
          (str);
          // Отведение памяти под новую строку
          str=(char*)(l1+l2+1);
          // Занесение строки в отведенную память
          if(prefix!=NULL) // Строка prefix не пуста
            { strcpy(str,prefix); // Копировать prefix
              strcat(str,buf);    // Дописать buf
            }
          else // Строка prefix пуста
            strcpy(str,buf);      // Копировать buf
          break;
      }
    return ;
  // Отмена макроопределений
  #undef str
  #undef val
  #undef prefix
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================

  //==============================================================
  // Второй вариант - использование сервисной функции 
  //==============================================================

  //============= Модель блока ==============
  extern "C" __declspec(dllexport)
    int  TestIntStr1(int CallMode,
                          BlockData,
                          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 :
          if(strcmp((char*)ExtParam,"{SSAIA}")==0)
            return ;
          return ;

        // Выполнение такта моделирования
        case :
          // Преобразование числа в строку
          itoa(val,buf,10);
          // Освобождение прежнего значения str
          (str);
          // Формирование выходной строки
          str=(prefix,buf,TRUE);
          break;
      }
    return ;
  // Отмена макроопределений
  #undef str
  #undef val
  #undef prefix
  #undef Ready
  #undef Start
  #undef pStart
  }
  //=========================================


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