Имя: Пароль:
1C
1С v8
Кто работал с ДвоичнымиДанными в NativeApi?
,
0 H A D G E H O G s
 
01.11.12
16:22
Дня доброго.
Собственно, отправляю в компоненту ДвоичныеДанные.
В компоненте получаю эти двоичные данные функцией
модуля v8napi

function V8AsBlob(V: PV8Variant): PByte;
begin
 case (V.vt and VTYPE_TYPEMASK) of
   VTYPE_BLOB:
     result := PByte(V.VarEnum.vtRecString.pstrVal);
 else
   result := nil;
 end;
end;

Она возвращает указатель на первый байт блока памяти, (странно, почему не pointer). Как узнать длину?
1 H A D G E H O G s
 
01.11.12
16:24
Дольше писал, блин

v.VarEnum.vtRecString.strLen

скорее всего оно.

Сравню с Двоичные.Размер(), совпадет, оно...

Или я вообще не туда залез?
2 Serginio1
 
01.11.12
16:30
Не ты писал? http://www.rsdn.ru/forum/com/4946608.flat

Смотри работу с SafeArray.
3 H A D G E H O G s
 
01.11.12
16:33
(2) Не я.
Native не работает с safearray же
4 Serginio1
 
01.11.12
16:35
http://www.sql.ru/forum/actualthread.aspx?tid=778607
type
 TIntArray = array [1 .. 200000, 1 .. 20] of Integer;
 PIntArray = ^TIntArray;
var
 sheet_ar: Variant;
 iMax, i, jMax, j, k: Integer;
 pData: PIntArray;
begin
 sheet_ar := VarArrayCreate([1, 200000, 1, 20], varInteger);
 iMax := VarArrayHighBound(sheet_ar, 1);
 jMax := VarArrayHighBound(sheet_ar, 2);

 pData := PIntArray(VarArrayLock(sheet_ar));
 for i := 1 to iMax do
   for j := 1 to jMax do
     pData^[i, j] := i * jMax + j;
 VarArrayUnlock(sheet_ar);
end;

Это почему же?
5 H A D G E H O G s
 
01.11.12
16:36
Говорит "Неверный аргумент" на ДвоичныеДанные.

Дельфи тормозится даже на ошибки в защищенном блоке, даже без отладочных dcu, тут - нет.
Значит это обработанно самой 1С-кой...

Какой тип данных 1С должен представляться BLOB -ом в ВК.
По идее - подходили ДвоичныеДанные, но вот нет!
6 Serginio1
 
01.11.12
16:38
Вообще смотри функции VarArrayLock получаешь ссылку на двоичные данные с обязательным вызовом VarArrayUnlock
Если нужны тормоза то v[i]
7 Serginio1
 
01.11.12
16:39
Двоичные данные это объект Двоичные данные. Передавай в виде Base64
8 H A D G E H O G s
 
01.11.12
16:40
(7) Это я и сам знаю.
9 H A D G E H O G s
 
01.11.12
16:40
(7) Для чего нужна функция

function V8AsBlob(V: PV8Variant): PByte;
begin
 case (V.vt and VTYPE_TYPEMASK) of
   VTYPE_BLOB:
     result := PByte(V.VarEnum.vtRecString.pstrVal);
 else
   result := nil;
 end;
end;
10 Serginio1
 
01.11.12
16:50
(9) Понял. Сразу не врубился. Но вообще данные логичнее передавать через safeArray?
Кстати а у них то есть описание этого блоба?
11 H A D G E H O G s
 
01.11.12
16:50
http://www.asd-dnepr.com/v82vkomponent.html#_Comp_cpp

Компонента может возвращать любые двоичные данные, например – сформированное изображение штрих-кода. Для этого данные помещаются в поле pstrVal структуры tVariant, в strLen – размер данных, а тип устанавливается в VTYPE_BLOB. 1С:Предприятие использует для них тип ДвоичныеДанные.

Про получать ничего не сказано. Прям бида с ними.
12 Serginio1
 
01.11.12
16:51
Ну и v.VarEnum.vtRecString.strLen работает?
13 H A D G E H O G s
 
01.11.12
16:54
В момент:
Компонента.НапечататьКартинку(Двоичное);
1С дает ошибку

{Форма.ФормаДокумента.Форма(44)}: Ошибка при вызове метода контекста (НапечататьКартинку)
   Компонента.НапечататьКартинку(Двоичное);
по причине:
Неверный аргумент

А отладчик Дельфи даже не шелохнется.
14 Serginio1
 
01.11.12
16:54
PByte(V.pstrVal); а длина в V.strLen  Нет?
15 Serginio1
 
01.11.12
16:56
Так ты формируешь двоичные даные на стороне Delphi?
А как ты эти ДД создаешь?
16 H A D G E H O G s
 
01.11.12
16:57
(15) Нет.
ДвоичныеДанные у меня в 1С.
Когда я их отправляю в компоненту - возникает ошибка (13)
17 Serginio1
 
01.11.12
17:00
А понял. А можешь вызвать в Delphi функцию Размер? Помоему передается объект ДД.
18 H A D G E H O G s
 
01.11.12
17:03
Доктор, меня игнорируют!
Следующий!
19 H A D G E H O G s
 
01.11.12
17:04
(17) Какое Дельфи????
1С ка отстреливает ДвоичныеДанные еще до передачи управления компоненте, см (13)!
20 Serginio1
 
01.11.12
17:04
Так в итоге DD передается как VTYPE_BLOB а не varDispatch
21 H A D G E H O G s
 
01.11.12
17:06
Мистец
22 Serginio1
 
01.11.12
17:08
А что на стороне Delphi ты к варианту не можешь применить метод если он поддерживает интерфейс IDispatch? Правда тип должен быть varDispatch
23 H A D G E H O G s
 
01.11.12
17:08
(22) Ты (13) читал?
24 Serginio1
 
01.11.12
17:19
Читал. Я спрашивал какой тип тебе в Delphi попадает

Если смотреть структуру

PV8Variant = ^V8Variant;
 V8Variant = packed record
   VarEnum: TVarEnum;
   cbElements: LongWord; //Dimension for an one-dimensional array in pvarVal
   vt: V8TYPEVAR;
 end;

То ссылка должна храниться в
cbElements

Иследуй VarEnum и Vt
25 H A D G E H O G s
 
01.11.12
17:21
(24) Как их исследовать?
26 Serginio1
 
01.11.12
17:25
Ты получаешь ссылку на PV8Variant. Чему равно значение VarEnum и V8TYPEVAR
TVarEnum = record
   case byte of
     1: (i8Val: byte);
     2: (shortVal: ShortInt);
     3: (lVal: Integer);
     4: (intVal: Integer);
     5: (uintVal: LongWord);
     6: (llVal: int64);
     7: (ui8Val: byte);
     8: (ushortVal: Word);
     9: (ulVal: LongWord);
     10: (ullVal: Int64);
     11: (errCode: Integer);
     12: (hRes: LongWord);
     13: (fltVal: Single);
     14: (dblVal: double);
     15: (bVal: boolean);
     16: (chVal: char);
     17: (wchVal: WideChar);
     18: (date: TDateTime);
     19: (IDVal: TGUID);
     20: (pvarVal: pointer);
     21: (tmVal: TV8tm);
     22: (vtRecInterface: TV8InterfaceVarRec);
     23: (vtRecString: TV8StringVarRec);
     24: (vtRecWideString: TV8WideStringVarRec);
 end;
27 Serginio1
 
01.11.12
17:27
Тьфу можно исследовать только V8TYPEVAR.
28 Serginio1
 
01.11.12
17:28
И данные могут храниться как в VarEnum так и в cbElements
29 H A D G E H O G s
 
01.11.12
17:30
(26) Еще раз.
Внимательно прочитай (13).
Как ты его понимаешь?
30 H A D G E H O G s
 
01.11.12
17:31
Ключевые слова

"А отладчик Дельфи даже не шелохнется."

"1С ка отстреливает ДвоичныеДанные еще до передачи управления компоненте"
31 Serginio1
 
01.11.12
17:32
Кстати у safeArray тоже есть свойство cbElements

http://msdn.microsoft.com/ru-ru/library/ms379375.aspx

(30) То есть данные до Delphi даже не доходят?
32 H A D G E H O G s
 
01.11.12
17:33
(31) ДА! Наконец то!
33 Serginio1
 
01.11.12
17:34
В 7 ке отладчик тоже плохо срабатывал приходилось вызывать ShowMessage
34 Serginio1
 
01.11.12
17:35
Передавай в виде Base64. Так и пиши, что вызовов до ВК не доходит. А не шелыхиваться может по многим причинам.
35 Serginio1
 
01.11.12
17:36
А кстати в NativeAPI можно передавать объекты 1С?
36 Serginio1
 
01.11.12
17:56
Кстати получение длины
function V8StrLen(V: PV8Variant): integer;
begin
 case (V.vt and VTYPE_TYPEMASK) of
   VTYPE_PSTR, VTYPE_BLOB:
     result := V.VarEnum.vtRecString.strLen;
   VTYPE_PWSTR:
     result := V.VarEnum.vtRecWideString.wstrLen;
 else
   result := 0;
 end;
end;
37 H A D G E H O G s
 
01.11.12
17:58
Ну их нафиг, эти заморочки, этот черный ящик херов.
Сделал через временный файл.
Чем больше работаю с 1С - тем больше убеждаюсь, что работают самые тупые и прямые методы.
38 Serginio1
 
01.11.12
18:12
Кстати ради интереса а какой тип получается при возврате
данных ввиде VTYPE_BLOB
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;
39 Serginio1
 
01.11.12
18:13
(37) так через строку ведь проще.