Передача Variant
От: Аноним  
Дата: 09.02.04 15:33
Оценка:
Привет всем!

Есть такой ASP скрипт:

dim myVar
dim filler
myVar = Request.BinaryRead(Request.TotalBytes)
Set filler = Server.CreateObject('ComDBFiller')
filler.FillDBFromBuf myVar, Request.TotalBytes


класс ComDBFiller — мой COM-класс, написанный на Delphi
метод ComDBFiller.FillDBFromBuf определен так:

procedure FillDBFromBuf(var Buffer: OleVariant; Count: Integer); safecall;


Вопрос по реализации метода FillDBFromBuf:
КАК запихнуть данные из Buffer в TMemoryStream???
Варианты:

Stream.Write(Buffer, Count); // не работает - запихиваются совсем другие данные


Большая просьба помочь, кто знает.
Re: Передача Variant
От: Shtirliz Россия  
Дата: 10.02.04 06:25
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Привет всем!




А>
А>Stream.Write(Buffer, Count); // не работает - запихиваются совсем другие данные
А>


А>Большая просьба помочь, кто знает.


Попробуй так:
Stream.Clear;
Stream.SetSize(Count);
CopyMemory(Stream.memory,@buffer,Count);


Примерно так...
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
Re: Передача Variant
От: Аноним  
Дата: 10.02.04 06:58
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>Stream.Write(Buffer, Count); // не работает - запихиваются совсем другие данные
А>


Рой в направлении VarData VType and varArray <> 0.
по идее дожно быть так
Stream.Write(TVarData(Buffer).varArray^.Data^, Count);
Но здесь надо учесть тот момент, что массивы в вариантах многомерные(см SystemPas.TVarArray)
Re: Передача Variant
От: Аноним  
Дата: 10.02.04 10:00
Оценка:
Привет, это опять автор вопроса

Спасибо тем,кто ответил

Оба способа опробованы, но результата не дали

2Shtirliz

Stream.Clear;
Stream.SetSize(Count);
CopyMemory(Stream.memory,@buffer,Count);


Такой вариант тоже не работает, в том смысле, что получаются не те данные. Для отладки был написан COM-клиент на Delphi и выяснилось, что, в принципе, работает следующий вариант:

type
TBArray = array of byte;
var
  BufArray: TBArray;
begin
...
SetLength(BufArray, Count);
DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));
Stream.Clear;
Stream.SetSize(Count);
CopyMemory(Stream.memory,BufArray,Count);
...


но если COM-клиентом выступает ASP-скрипт при вызове

DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));


происходит AV.

Почему — не понятно

VarIsArray(Buffer) возвращает true.

2Аноним:
при вызове COM-объекта из Delphi предложенный тобой вариант работает:

if (VarIsArray(Buffer)) then
begin
  a := FindVarData(Buffer);
  Stream.Write(a^.VArray^.Data^, Count);
end;


но при вызове из ASP-скрипта a^.VArray = nil
почему — опять же непонятно

Вобщем, если у кого-нибудь будут какие-нить идеи — очень прошу, помогите
Второй день над этим сижу, намучилась донельзя
Re[2]: Передача Variant
От: Shtirliz Россия  
Дата: 10.02.04 13:56
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Привет, это опять автор вопроса


А>
А>DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));
А>


А>происходит AV.


А>Почему — не понятно


Попробуй не приводить к поинтеру BufArray...
Или так не работает?
... << RSDN@Home 1.1.2 stable >> ...<<Win32NT 5.0.2195.0 >>
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
Re[3]: Передача Variant
От: Аноним  
Дата: 10.02.04 14:21
Оценка:
Здравствуйте, Shtirliz, Вы писали:

А>>
А>>DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));
А>>


А>>происходит AV.


S>Попробуй не приводить к поинтеру BufArray...

S>Или так не работает?

Да, так не работает
Ошибка компилятора насчет несоответствия типов
Re[4]: Передача Variant
От: Shtirliz Россия  
Дата: 10.02.04 14:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Shtirliz, Вы писали:


А>>>
А>>>DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));
А>>>


А>>>происходит AV.


S>>Попробуй не приводить к поинтеру BufArray...

S>>Или так не работает?

А>Да, так не работает

А>Ошибка компилятора насчет несоответствия типов

А если @BufArray[0]?
... << RSDN@Home 1.1.2 stable >> ...<<Win32NT 5.0.2195.0 >>
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
Re[5]: Передача Variant
От: Аноним  
Дата: 10.02.04 15:14
Оценка:
Здравствуйте, Shtirliz, Вы писали:

А>>>>
А>>>>DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));
А>>>>


А>>>>происходит AV.


S>>>Попробуй не приводить к поинтеру BufArray...

S>>>Или так не работает?

А>>Да, так не работает

А>>Ошибка компилятора насчет несоответствия типов

S>А если @BufArray[0]?


Та ж фигня

Проверено Pointer(BufArray) <> nil
Re[4]: Передача Variant
От: Shtirliz Россия  
Дата: 11.02.04 06:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Shtirliz, Вы писали:


А>>>
А>>>DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));
А>>>


А>>>происходит AV.


S>>Попробуй не приводить к поинтеру BufArray...

S>>Или так не работает?

А>Да, так не работает

А>Ошибка компилятора насчет несоответствия типов

Покопай в сторону TVarData. Там есть и массивы....

Stream.Clear;
Stream.SetSize(Count);
CopyMemory(Stream.memory,TVarData(Buffer).VArray.Data,Count);


Может так поможет....
... << RSDN@Home 1.1.2 stable >> ...<<Win32NT 5.0.2195.0 >>
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
138385660
Re[5]: Передача Variant
От: catherine Украина  
Дата: 11.02.04 11:45
Оценка:
Здравствуйте, Shtirliz, Вы писали:

Все — получилось — спасибо огромное за советы.
Оказывается, дело было в неверной передаче Variant в метод
Теперь работает следующим образом:
ASP-скрипт

Dim Buffer
Dim CountBytes
Dim Filler

CountBytes = Request.TotalBytes
Buffer = Request.BinaryRead(CountBytes)

Set Filler = Server.CreateObject("ComDBFiller.DBFiller")
Filler.FillDBFromBuf Buffer, CountBytes


Delphi-код:

if (VarIsArray(Buffer)) then
begin
  SetLength(BufArray, Count);
  DynArrayFromVariant(Pointer(BufArray), Buffer, TypeInfo(TBArray));

  Stream.Clear;
  Stream.SetSize(Count);
  CopyMemory(inStream.Memory, BufArray, Count);
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.