Имя: Пароль:
1C
1С v8
Native API не умеет принимать ДвоичныеДанные?
0 H A D G E H O G s
 
01.10.11
20:31
При выполнении метода объекта, в которого пытаюсь передать ДвоичныеДанные, 1С ка вываливает модальное окно с ошибкой "Неверный аргумент" и после, закрывается.

Дебагером по стеку в Дельфи вижу, что ошибка возникает раньше, чем выполнение перейдет во внешку, тоесть проверка производиться в самой платформе (была бы ошибка в описании приема параметра функции - стек бы "дошел" до самой компоненты).

Тоесть, возвращать ДвоичныеДанные она (компонента) - может, а принимать - нет?

p.s. Как бы не проблема - передам Base64 строку, но все таки..?
1 H A D G E H O G s
 
01.10.11
20:32
Просто нигде не описано, блеать!
2 H A D G E H O G s
 
01.10.11
21:10
up
3 orefkov
 
01.10.11
23:10
Насколько я помню, в Native API между ВК и платформой ходят только простые типы данных, объекты не поддерживаются.

А так вообще по описанию плохо понятна твоя проблема.
Код посмотреть, мож че и подсказал бы.
4 DmitrO
 
01.10.11
23:58
(3)Cаня, это так. Но я своими глазами в документации по технологии ВК читал как там передавать из компоненты именно двоичные данные. (Но вообще-то не пробовал.)
Удивительно что в компоненту их передать нельзя.. похоже на косяк.
(2) релиз бы назвать надо бы..
5 DmitrO
 
02.10.11
00:00
(0)Байтовый SafeArray тоже не мешало бы проверить
6 Serginio1
 
04.10.11
15:00
Вообщето судя по соурсам

procedure TV8UserObject.V8ClearVar(V: PV8Variant);
begin
 if (V.vt and VTYPE_TYPEMASK) in [VTYPE_BLOB, VTYPE_PSTR, VTYPE_PWSTR,
   VTYPE_INTERFACE] then
 begin
   case (V.vt and VTYPE_TYPEMASK) of
     VTYPE_BLOB:
       if V.VarEnum.vtRecString.pstrVal <> nil then
         V8MM.FreeMemory(@(V.VarEnum.vtRecString.pstrVal));
     VTYPE_PSTR:
       if V.VarEnum.vtRecString.pstrVal <> nil then
         V8MM.FreeMemory(@(V.VarEnum.vtRecString.pstrVal));
     VTYPE_PWSTR:
       if V.VarEnum.vtRecWideString.pwstrVal <> nil then
         V8MM.FreeMemory(@(V.VarEnum.vtRecWideString.pwstrVal));
     VTYPE_INTERFACE:
       IInterface(V.VarEnum.vtRecInterface.pInterfaceVal) := nil;
   end;
 end;
 FillChar(V^, sizeof(V8Variant), 0);
end;

function TV8UserObject.V8SetBlob(V: PV8Variant; Value: PByte;
 Length: integer): boolean;
begin
 result := (Value = nil);
 if result then
   Exit;

 V8ClearVar(V);

 V.vt := VTYPE_BLOB;
 result := V8MM.AllocMemory(@(V.VarEnum.vtRecString.pstrVal), Length);
 if result then
 begin
   Move(Value^, V.VarEnum.vtRecString.pstrVal^, Length);
   V.VarEnum.vtRecString.strLen := Length;
 end;
end;

По идее должен, только память выделять и очищатьсамому .нужно
7 Serginio1
 
04.10.11
15:03
А вообще по уму нужно сделать оболочку для IDispatch через ITypeInfo и будет все работать на вин клиентах.
8 Serginio1
 
04.10.11
15:06
Понял. А обратно созданые из ВК двоичные данные передает?
9 H A D G E H O G s
 
04.10.11
15:10
(6) Проверял из 1С в ВК передать safearray - та же фигня.
10 H A D G E H O G s
 
04.10.11
15:11
Вообще - покуй
XDTO преобразование - и массив с числами (строками) в виде текста ушел в ВК.
Там его ласково встречает TXMLDocument и все пучком.
11 H A D G E H O G s
 
04.10.11
15:12
(7) Вот тут подробнее плиз!
12 H A D G E H O G s
 
04.10.11
15:13
И еще - че то задумался - а в СП нигде не встретил, что COM компонента на Тонком недоступна. Принял на веру читая форум. Это факт?
13 Serginio1
 
04.10.11
15:21
Ну ты даешь? Уже лет десять пользуюсь, только этой ВК с с объектами автоматизации.
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019

Для Native API между методами нужно из PV8Variant в олевариант и обратно и писать только Idispatch объекты хоть на Delphi, хоть на Net и не мучаться
14 Serginio1
 
04.10.11
15:34
А вообще до этой ВК я и делал маленькую ВК которая возвращала в 1С ссылку на appDispatch которую передавал уже в олешный объект откуда доставал все интерфейсы обратного вызова, вот и сейчас так же можно и поступить.
15 H A D G E H O G s
 
04.10.11
15:37
(14) Ниче не понял. :-(
16 Serginio1
 
04.10.11
16:07
ВК нужна в большинстве случаев только для ExternalEvent
В олешной ВК это интерфейс а вернее IAsyncEvent.
Просто создавалась вк которая при
function Init(pConnection: IDispatch)
сохраняла pConnection
И был метод который возвращал этот pConnection в 1С и уже эта переменная передавалась в Олеобъект который из этой переменной и доставал все нужные интерфейсы.

Здесь немного сложнее но можно получить TV8AddInDefBase и передавать его в оле объект. Но как там передача с олеобъектами. Вообще как через тип TV8InterfaceVarRec можно передать.
17 Serginio1
 
04.10.11
16:15
Вернее так внутри вк создать оле Объект который бы реализовал все интерфейсы через TV8AddInDefBase, вернуть в 1С через переменную типа TV8InterfaceVarRec и вот ее уже передавать в Оле объект.
18 H A D G E H O G s
 
04.10.11
16:43
<<вернуть в 1С через переменную типа TV8InterfaceVarRec>>
19 H A D G E H O G s
 
04.10.11
16:43
Не получится, 1С зарубит это дело
20 Serginio1
 
04.10.11
16:50
Точно? Тогда зачем он нужен этот тип TV8InterfaceVarRec? Но в любом случае создать ВК которая загружала бы оле объект и вызывала бы его методы через IDispatch c рефлексией через ITypeInfo не сложно. Рыба уже есть. А объект поддерживающий IAsyncEvent,IStatusLine,IErrorLog все равно нужно. Попытка не пытка?
21 H A D G E H O G s
 
04.10.11
16:50
Но у меня есть идея, как передать ole объект в 1С.

1) создать оле Объект который бы реализовал все интерфейсы через TV8AddInDefBase
2) Зарегистрировать его в ROT
3) Вернуть его идентификатор в ROT -е в 1С (не помню че там GUID вроде)
4) Написать COM-сервер простенький, который получит этот COM объект из ROT-а
5) Новый ComОбъект() поддерживается ТонкимКлиентом
6) Вернем ОЛЕ объект вызовом метода COM сервера.
7) Профит
22 H A D G E H O G s
 
04.10.11
16:51
(20) Думаю - зарубит.
23 acsent
 
04.10.11
16:56
А смысл тогда в нативных компонентах?
24 Serginio1
 
04.10.11
16:58
По уму раз 22: (vtRecInterface: TV8InterfaceVarRec);
     23: (vtRecString: TV8StringVarRec);
     24: (vtRecWideString: TV8WideStringVarRec);
Раз две последние работают, почему первый не должен.
Все равно будешь реализовывать интерфейсы попробуй и с передацей в 1С.
А как ты из ВК в этот пока непонятном для меня ROT будешь регестрировать?
25 H A D G E H O G s
 
04.10.11
16:58
(23)
а) Выполнение на линукс-сервере
б) Выполнение в неIE веб браузере
в) Теоретически - шустрее

Вроде бы так.
26 Serginio1
 
04.10.11
16:58
(23) Для линукса, маков
27 Serginio1
 
04.10.11
17:00
ROT я так понимаю синглетон оле сервер в который можно передать объект и из него и получить?
28 acsent
 
04.10.11
17:01
(25) Какие тогда могут быть разговоры про ОЛЕ?
29 acsent
 
04.10.11
17:01
Вот выйдет нативный линукс клиент
30 Serginio1
 
04.10.11
17:02
(29) А почему Вэб клиент поддерживает ComОбъект()?
31 H A D G E H O G s
 
04.10.11
17:03
(24)
http://www.asd-dnepr.com/v82vkomponent.html#_cpp_warning

цитата

Возвращаемые значения типа VTYPE_ARRAY и VTYPE_BYREF не поддерживаются.
32 H A D G E H O G s
 
04.10.11
17:05
(27) Да просто механизм операционки для хранения COM объектов (по желанию).
http://msdn.microsoft.com/en-us/library/ms695276(VS.85).aspx
33 Serginio1
 
04.10.11
17:11
Спасибо вспомнил. Но в конце то концов можно вернуть как число, а в олеобъекте привести к интерфейсу
34 Serginio1
 
04.10.11
17:13
Главное сохранить ссылку на неё в ВК что бы не разрушилась
35 H A D G E H O G s
 
04.10.11
17:21
Но это все лирика.

Физика говорит мне, что пока буду юзать XDTO.

А вот червь сомнений гложет меня в плане - осилит ли система XDTO сериализацию на массив этак скажем в пару миллионов элементов?
36 Serginio1
 
04.10.11
17:25
А зачем тебе XDTO. Я вообще склоняюсь к встроенной Базе данных кторых как собак нерезанных.И сериализуй и десериализуй из неё на основании метаданных. Все очень комактно и быстро за счет индексов.
37 Кирпич
 
04.10.11
17:27
Ну в документации 1с написано что только простые типы и можно возвращать из ВК двоичные данные. Всё. Чо вы как будто расстроилися.
38 Serginio1
 
04.10.11
17:33
(37) Ну объект это число и лучше четырех байтное. Просто нужно знать к чему его приводить.
39 Serginio1
 
04.10.11
17:33
Тьфу восьми байтное т.к. ИЕ и 64 разрядный бывает
40 H A D G E H O G s
 
04.10.11
17:43
(36) Мне не нужны индексы. Я ничего искать не буду.
Мне нужен поток.
41 Serginio1
 
04.10.11
18:03
(40) И чем XDTO от бд отличается? Только излишней информацией. Если объекты содежат множество ссылочных полей, то сериализавать их проще в разные таблицы с индексами по ключевым полям.
42 H A D G E H O G s
 
04.10.11
18:06
(41) Забей.
Это не важно.