Имя: Пароль:
1C
1С v8
1C и AddInNative. Возврат значения в 1С.
,
0 temapriv
 
26.06.17
06:16
Пытаюсь написать свою внешнюю нативную компоненту по образцу из ИТС на С++. В С++ ничего не понимаю. Компонента предназначена для работы с другой dll, то есть как обёртка.
Вызовы функций осилил, а вот возврат значений из компоненты в платформу никак не могу победить.
В CallAsFunc добавляю обработку своих вызовов функции. Дальше с возвратом проблемы. Есть вроде как указатель на переменную типа tVariant. Как в него что-то отдать не понимаю, и по примерам не получается.
Как я понимаю, нужно привести сначала данные к нужному типу, потом куда-то сложить.
Покажите на пальцах пожалста, "я из деревни". :)
1 igorPetrov
 
26.06.17
06:22
(0) Как можно писать на  С++, ничего не понимая в  С++? Жесть
2 sFAQer
 
26.06.17
06:49
(1) в 1Сеж получается...
3 igorPetrov
 
26.06.17
07:35
(2) +100 ))))
4 Кирпич
 
26.06.17
07:43
Щас появится адепт
5 temapriv
 
26.06.17
07:46
(4) жду, ага
6 temapriv
 
26.06.17
07:46
+(5)но нужно другое
7 Имитация работы
 
26.06.17
07:47
(4) Не появится. Он нашел работу и фанатеет от typescript. Славные деньки Ъ в прошлом...
8 igorPetrov
 
26.06.17
07:47
(6) что ж тебе нужно, девИца?
9 temapriv
 
26.06.17
07:50
(8) я вам не девИца, уважаемый. Есть что по делу сказать, говорите. Флудить, пожалуйста, не нужно.
10 igorPetrov
 
26.06.17
07:54
(9) Что тут можно сказать по делу? Ты чего ждешь? Готового решения от других, так ты его все равно не поймешь.
11 orefkov
 
26.06.17
08:08
(0)
Раз указатель, то вместо точки надо писать стрелочку:
retVal->vt = VTYPE_I4;
retVal->lVal = 1;
12 temapriv
 
26.06.17
08:22
(11) Спасибо. Такая запись срабатывает.
vt - это описание типа значит? а lVal - как работает? В описании типов написано:
_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;

Верно понимаю, в какое "поле" присваивать значение зависит от типа?
Если мне нужно передать более сложный объект, получается его тут нужно описать?
13 Мимохожий Однако
 
26.06.17
08:27
Форумы по С++ закрыли уже?
14 arsik
 
гуру
26.06.17
08:31
(12) Мне кажется, это описаны те типы которые 1С может преобразовать в свои. Туда нельзя добавить.
15 temapriv
 
26.06.17
08:37
(14) Да, похоже на то. На ИТС они описаны. Вопрос остаётся со сложными объектами. Вроде как подошел бы VTYPE_VARIANT,вроде как структура из любых типов, но опять же ИТС гласит, что этот тип не поддерживается.
16 orefkov
 
26.06.17
08:40
(15)
По технологии native в данный момент нельзя передать объекты. Поддерживаются только примитивные типы.
union - это объединение, то есть все эти поля занимают одну область памяти, и следовательно, в один момент времени там может быть только одно из этих типов значений. Какое - указывается в vt.
17 temapriv
 
26.06.17
08:51
(16) Спасибо. Становится яснее. Структуру значит можно передать, придётся как-то в неё всё складывать.
Еще в примерах используется выделение памяти с помощью AllocMemory. В чем тогда разница? Есть указатель, можно в него отдать данные, а можно отдельно выделить память с этим же указателем?
18 Кирпич
 
26.06.17
08:54
а где адепт? уж не заболел ли.
19 temapriv
 
26.06.17
08:56
(18) в (7) говорят, что ему некогда.
20 temapriv
 
26.06.17
13:26
продолжу дальше :)
у меня из сторонней dll возвращается структура, в которой есть свойство char, длиной 100. Я пытаюсь его передать в 1С в функции.
Делаю так:

size_t newsize = strlen(designInfo.designName)+1;
wchar_t * wcstring = new wchar_t[newsize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcstring, newsize, designInfo.designName, _TRUNCATE);
WCHAR_T* result = 0;
::convToShortWchar(&result, wcstring);


потом пытаюсь отдать в 1С

pvarRetValue->vt = VTYPE_PWSTR;            
pvarRetValue->pwstrVal = result;
pvarRetValue->strLen = sizeof(result);


при вызове,1С падает с ошибкой "некорректная работа компоненты с памятью". Подскажите, чего делаю не так?
21 temapriv
 
26.06.17
13:27
то, что пытаюсь передать в designInfo.designName
22 Кирпич
 
26.06.17
13:40
почитай про менеджер памяти 1С и подумай нахрена он вообще нужен
23 temapriv
 
26.06.17
13:43
(22) вот там я повыше спрашивал про это. Потому как непонятно, где-то он используется, где-то.
24 Кирпич
 
26.06.17
13:44
ну вот здесь и используется
25 Кирпич
 
26.06.17
13:47
почитал бы документацию. и работы меньше и позора.
26 temapriv
 
26.06.17
13:49
(24) Хорошо. Почему я число могу вернуть, не используя менеджер, а строку не могу.
27 Кирпич
 
26.06.17
13:52
(26) потому что 1С падает с ошибкой "некорректная работа компоненты с памятью"
28 temapriv
 
26.06.17
13:56
(27) так хорошо объясняете
29 Кирпич
 
26.06.17
13:59
(28) "При вызове методов компоненты и передаче возвращаемых значений, которые не могут быть переданы полностью через стек, компонента должна выделять память с помощью функции AllocMemory, предоставляемую менеджером памяти. "1С:Предприятие" впоследствии освободит эту память с помощью функции FreeMemory."
https://its.1c.ru/db/metod8dev#content:3221:hdoc:_struct_folder

так пойдет?
30 temapriv
 
26.06.17
14:01
(29) Спасибо большое, теперь ясно.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.