
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем привет!
На диске информационно-технического сопровождения от 1С есть пример внешней компоненты. Там имеется такая функция: ![]() ![]() 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)? |
Сообщ.
#2
,
|
|
|
Цитата yasli @ tVariant* paParams - это указатель на массив параметров типа tVariant. Судя по коду, это не массив параметров, а строка (char или wchar_t). Если точнее, то это имя файла. Цитата yasli @ И еще, для чего нужно выражение TV_VT(paParams)? Похоже, TV_VT - это некий define, который определяет тип переданного параметра. |
Сообщ.
#3
,
|
|
|
Вот выдержка из статьи "Технология создания внешних компонент" с диска ИТС.
![]() А вот определение TV_VT: ![]() ![]() #define TV_VT(X) ((X)->vt) И еще tVariant: ![]() ![]() 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; |
Сообщ.
#4
,
|
|
|
Ну, да. Просто в этой функции используется только один параметр.
Цитата yasli @ А вот определение TV_VT: Похоже сделали define для упрощения записи. |
Сообщ.
#5
,
|
|
|
А если мне нужно передать второй параметр, как будет выглядеть его получение?
|
Сообщ.
#6
,
|
|
|
![]() ![]() paParams[0] - первый paParams[1] - второй ... paParams[n] - (n+1)-ый |
Сообщ.
#7
,
|
|
|
Попробовал вот так:
![]() Получились такие ошибки: ![]() Если сделать так: ![]() Будет такая ошибка: ![]() Подскажите, как поправить? |
Сообщ.
#8
,
|
|
|
yasli, зачем вы используете картинки? Есть же тег "код".
Пробуйте так: ![]() ![]() switch(paParams[1].vt) или так: ![]() ![]() switch(TV_VT(&(paParams[1]))) |
Сообщ.
#9
,
|
|
|
artsb, спасибо огромное!
Вариант ![]() ![]() switch(TV_VT(&(paParams[1]))) |