|
Кто работал с ДвоичнымиДанными в 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
|
||||
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) так через строку ведь проще.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |