dim myVar
dim filler
myVar = Request.BinaryRead(Request.TotalBytes)
Set filler = Server.CreateObject('ComDBFiller')
filler.FillDBFromBuf myVar, Request.TotalBytes
класс ComDBFiller — мой COM-класс, написанный на Delphi
метод ComDBFiller.FillDBFromBuf определен так:
Дункан Маклауд любил ходить в лес и издеваться над кукушками.
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)
Такой вариант тоже не работает, в том смысле, что получаются не те данные. Для отладки был написан 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-скрипт при вызове
А>>>происходит AV.
S>>Попробуй не приводить к поинтеру BufArray... S>>Или так не работает?
А>Да, так не работает А>Ошибка компилятора насчет несоответствия типов
А>>>>происходит AV.
S>>>Попробуй не приводить к поинтеру BufArray... S>>>Или так не работает?
А>>Да, так не работает А>>Ошибка компилятора насчет несоответствия типов
S>А если @BufArray[0]?
А>>>происходит AV.
S>>Попробуй не приводить к поинтеру BufArray... S>>Или так не работает?
А>Да, так не работает А>Ошибка компилятора насчет несоответствия типов
Покопай в сторону TVarData. Там есть и массивы....
Все — получилось — спасибо огромное за советы.
Оказывается, дело было в неверной передаче 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;