Имя: Пароль:
1C
 
Внешняя компонента для 1С
,
0 ozon0
 
20.05.15
16:39
Разбираюсь с технологией создания внешних компонент по статье http://habrahabr.ru/post/191014/. С С++ дела имел давно, пытаюсь разобраться.
Пример, данный автором я успешно подключил, пытаюсь сделать из него что-то свое. В примере есть функция:

bool CAddInNative::wstring_to_p(std::wstring str, tVariant* val) {
    char* t1;
    TV_VT(val) = VTYPE_PWSTR;
    m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * sizeof(WCHAR_T));
    memcpy(t1, str.c_str(), (str.length()+1) * sizeof(WCHAR_T));
    val -> pstrVal = t1;
    val -> strLen = str.length();
    return true;
}

Как я понимаю, она получает строку str и записывает ее в val, 1c получает val  и уже в 1с я получаю ее значение. Пытаюсь переписать функцию для работы с числами. Если я внутри функции создаю переменную:
bool CAddInNative::wstring_to_p(double str, tVariant* val) {
    char t1 = 10;
    TV_VT(val) = VTYPE_R8;
    val -> dblVal= t1;
    return true;
}
все прекрасно работает. Но как мне получить str и передать ее в val?
В случае со строками это делает m_iMemory->AllocMemory((void**)&t1, (str.length()+1) * sizeof(WCHAR_T)) - выделяет память и memcpy, копирует str в t1. Пробую переписать их для double:

bool CAddInNative::wstring_to_p(double str, tVariant* val) {
    double* t1;
    double *ptr = &str;

    TV_VT(val) = VTYPE_R8;

    m_iMemory->AllocMemory((void**)&t1, sizeof(double));
    memcpy(t1, ptr, sizeof(double));
    val -> dblVal = *t1;
    //val -> strLen = str.length();
    return true;

}
Но в 1с передается 0.00..1. Повторюсь, с++ успел забыть, подскажите как переделать функцию.
1 DmitrO
 
20.05.15
16:45
для double выделять память не надо, просто так:
double t1 = 23.9;

TV_VT(val) = VTYPE_R8;
val -> dblVal = t1;
2 DmitrO
 
20.05.15
16:47
значение простых типов хранятся inplace, в самом Variant.
3 DmitrO
 
20.05.15
16:47
tVariant
4 ozon0
 
20.05.15
16:54
(1) так у меня работает, а если я пишу
double t1 = str;
TV_VT(val) = VTYPE_R8;
val->dblVal = t1;
то выдает 0.00..1;
5 H A D G E H O G s
 
20.05.15
17:02
Каким только извратом не занимаются c++, пытаясь реализовать то, что в Дельфи работает автоматом. :-)
6 ozon0
 
20.05.15
17:27
Разобрался. Я в 1С передаю компоненте значение 2, а надо именно double - 2.22 например. При это 2.00 тоже не работает. Вопрос - как работать и с целыми, и с плавающей точкой?
7 Serginio1
 
20.05.15
17:32
Decimal
8 Serginio1
 
20.05.15
17:38
9 ozon0
 
20.05.15
17:51
(7) 1C такого не знает
Соответствие типов tVariant и 1С:Предприятия

Тип tVariant объявлен в файле types.h (входит в комплект поставки).

    VTYPE_EMPTY соответствует неопределенному значению. При передаче в качестве параметра метода подставляется значение параметра по умолчанию;
    начения типа VTYPE_I2, VTYPE_I4, VTYPE_ERROR, VTYPE_UI1 соответствуют целочисленному значению и находятся в lVal;
    начения типа VTYPE_BOOL, соответствуют булевому значению и находятся в bVal;
    начения типа VTYPE_R4, VTYPE_R8, VTYPE_CY соответствуют дробному значению и находятся в dblVal;
    начение типа VTYPE_DATE соответствует значению даты и находится в date;
    начение типа VTYPE_TM соответствует значению даты и находится в struct tm tmVal;
    начение типа VTYPE_PSTR соответствует строковому значению (char*) и находится в pstrVal с указанием длины в strLen;
    начение типа VTYPE_PWSTR соответствует строковому значению (WCHAR_T*) и находится в pwstrVal с указанием длины в wstrLen;
    начение типа VTYPE_BLOB соответствует двоичным данным и находится в pstrVal с указанием длины в strLen;

Типы VTYPE_INTERFACE, VTYPE_VARIANT не поддерживаются.
10 Serginio1
 
20.05.15
17:59
(9) Восьмерка поддерживает Decimal в вариантах COM точно.  Проверял. Проверь в ВК
11 Serginio1
 
20.05.15
18:03
Да и ВК поддерживают https://infostart.ru/public/332786/
12 ozon0
 
20.05.15
19:06
(11) Я делаю Native API
13 su_mai
 
20.05.15
19:17
14 ozon0
 
20.05.15
19:46
(13) Читал статью, очень помогла. Она очень общая, или я не так читаю.
15 Serginio1
 
20.05.15
21:25
(12) Передавай как строку
16 Бертыш
 
21.05.15
03:26
Мне вот тоже жутко интересно создание своей компоненты по 1С 8, но мне интересно создание компоненты которая будетработать во всех вариантах....
Толстый клиент
Windows
Linux
Тонкий клиент
Windows
Linux
Web-клиенты

Куда мне рыть??? Что читать??