На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Написание внешней компоненты для 1С. Помогите разобраться.
    Всем привет!
    На диске информационно-технического сопровождения от 1С есть пример внешней компоненты.
    Там имеется такая функция:
    ExpandedWrap disabled
      bool CAddInNative::CallAsFunc(const long lMethodNum,
                      tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray)
      {
          bool ret = false;
          FILE *file = 0;
          char *name = 0;
          int size = 0;
          char *mbstr = 0;
          wchar_t* wsTmp = 0;
       
          switch(lMethodNum)
          {
          case eMethLoadPicture:
              {
                  if (!lSizeArray || !paParams)
                      return false;
                  
                  switch(TV_VT(paParams))
                  {
                  case VTYPE_PSTR:
                      name = paParams->pstrVal;
                      break;
                  case VTYPE_PWSTR:
                      ::convFromShortWchar(&wsTmp, TV_WSTR(paParams));
                      size = wcstombs(0, wsTmp, 0)+1;
                      mbstr = new char[size];
                      memset(mbstr, 0, size);
                      size = wcstombs(mbstr, wsTmp, getLenShortWcharStr(TV_WSTR(paParams)));
                      name = mbstr;
                      break;
                  default:
                      return false;
                  }
              }
                      
              file = fopen(name, "rb");
       
              if (file == 0)
              {
                  wchar_t* wsMsgBuf;
                  uint32_t err = errno;
                  name = strerror(err);
                  size = mbstowcs(0, name, 0) + 1;
                  wsMsgBuf = new wchar_t[size];
                  memset(wsMsgBuf, 0, size * sizeof(wchar_t));
                  size = mbstowcs(wsMsgBuf, name, size);
       
                  addError(ADDIN_E_VERY_IMPORTANT, L"AddInNative", wsMsgBuf, RESULT_FROM_ERRNO(err));
                  delete[] wsMsgBuf;
                  return false;
              }
       
              fseek(file, 0, SEEK_END);
              size = ftell(file);
              
              if (size && m_iMemory->AllocMemory((void**)&pvarRetValue->pstrVal, size))
              {
                  fseek(file, 0, SEEK_SET);
                  size = fread(pvarRetValue->pstrVal, 1, size, file);
                  pvarRetValue->strLen = size;
                  TV_VT(pvarRetValue) = VTYPE_BLOB;
                  
                  ret = true;
              }
              if (file)
                  fclose(file);
       
              if (mbstr)
                  delete[] mbstr;
       
              break;
          }
          return ret;
      }


    tVariant* paParams - это указатель на массив параметров типа tVariant.
    Здесь рассмотрен пример получения первого параметра из массива. Не могу понять, как получить второй параметр. Подскажите, пожалуйста.
    И еще, для чего нужно выражение TV_VT(paParams)?
      Цитата yasli @
      tVariant* paParams - это указатель на массив параметров типа tVariant.

      Судя по коду, это не массив параметров, а строка (char или wchar_t). Если точнее, то это имя файла.
      Цитата yasli @
      И еще, для чего нужно выражение TV_VT(paParams)?

      Похоже, TV_VT - это некий define, который определяет тип переданного параметра.
        Вот выдержка из статьи "Технология создания внешних компонент" с диска ИТС.
        user posted image

        А вот определение TV_VT:
        ExpandedWrap disabled
          #define TV_VT(X) ((X)->vt)


        И еще tVariant:
        ExpandedWrap disabled
          struct _tVariant
          {
              _ANONYMOUS_UNION union
              {
                  int8_t         i8Val;
                  int16_t        shortVal;
                  int32_t        lVal;
                  int            intVal;
                  unsigned int   uintVal;
                  int64_t        llVal;
                  uint8_t        ui8Val;
                  uint16_t       ushortVal;
                  uint32_t       ulVal;
                  uint64_t       ullVal;
                  int32_t        errCode;
                  long           hRes;
                  float          fltVal;
                  double         dblVal;
                  bool           bVal;
                  char           chVal;
                  wchar_t        wchVal;
                  DATE           date;
                  IID            IDVal;
                  struct _tVariant *pvarVal;
                  struct tm      tmVal;
                  _ANONYMOUS_STRUCT struct
                  {
                      void*  pInterfaceVal;
                      IID        InterfaceID;
                  } __VARIANT_NAME_2/*iface*/;
                  _ANONYMOUS_STRUCT struct
                  {
                      char*        pstrVal;
                      uint32_t     strLen; //count of bytes
                  } __VARIANT_NAME_3/*str*/;
                  _ANONYMOUS_STRUCT struct
                  {
                      WCHAR_T*    pwstrVal;
                      uint32_t    wstrLen; //count of symbol
                  } __VARIANT_NAME_4/*wstr*/;
              } __VARIANT_NAME_1;
              uint32_t      cbElements;    //Dimension for an one-dimensional array in pvarVal
              TYPEVAR       vt;
          };
          typedef struct _tVariant    tVariant;
          typedef tVariant    tVariantArg;
          Ну, да. Просто в этой функции используется только один параметр.
          Цитата yasli @
          А вот определение TV_VT:

          Похоже сделали define для упрощения записи.
          Сообщение отредактировано: artsb -
            А если мне нужно передать второй параметр, как будет выглядеть его получение?
              ExpandedWrap disabled
                paParams[0] - первый
                paParams[1] - второй
                ...
                paParams[n] - (n+1)-ый
              Сообщение отредактировано: artsb -
                Попробовал вот так:
                user posted image
                Получились такие ошибки:
                user posted image

                Если сделать так:
                user posted image
                Будет такая ошибка:
                user posted image
                Подскажите, как поправить?
                  yasli, зачем вы используете картинки? Есть же тег "код".
                  Пробуйте так:
                  ExpandedWrap disabled
                    switch(paParams[1].vt)

                  или так:
                  ExpandedWrap disabled
                    switch(TV_VT(&(paParams[1])))
                    artsb, спасибо огромное!
                    Вариант
                    ExpandedWrap disabled
                      switch(TV_VT(&(paParams[1])))
                    отработал как нужно!
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0426 ]   [ 16 queries used ]   [ Generated: 17.06.25, 16:08 GMT ]