Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Внизrecord как out-параметр в методах IAppServer Найти похожие ветки
← →
clickmaker (2003-06-20 14:24) [0]Есть DCOM-сервер (D5, MIDAS)
Есть record в его TLB
TPropInfo = packed record
Name: WideString;
DisplayName: WideString;
DataType: Smallint;
...
end;
Есть метод интерфейса-наследника IAppServer, где этот record в качестве out-параметра: RecordMethod(out PropInfo: TPropInfo)
Есть процедура на клиенте, которая вызывает этот метод. Перед ней вызывается другая процедура, у которой в качестве out - OleVariant VariantMethod(out Value: OleVariant)
Методы вызываются друг за другом так
VariantMethod(Value);
RecordMethod(PropInfo);
Проблема: если локальные параметры размещены так
var
Info: TPropInfo;
Value: OleVariant;
то все нормально, а если так
var
Value: OleVariant;
Info: TPropInfo;
то вызов RecordMethod обнуляет Value!!!
Видимо дело в распределении стека, но как record залезает в предыдущую локальную переменную - ума не приложу!
← →
Digitman (2003-06-20 14:35) [1]это скорей всего зависит от того, что у тебя творится в теле RecordMethod()
думаю, ты там выходишь за границы памяти, отведенной под результат
а вот то что "обнуляет Value" как раз и неудивительно.
поскольку переменные локальные, то память под них отводится автоматически в стеке, при этом адрес переменной Info будет меньше адреса переменной Value.
← →
Serginio (2003-06-20 14:41) [2]А где они расположены в классе или как переменные процедуры или юнита
← →
Юрий Федоров (2003-06-20 14:44) [3]Вообще то я замечал откровенные глюки при передаче через DCOM структур с WideString. Причем именнно когда они идут как out-параметры. Никто больше с этим не сталкивался ?
← →
Serginio (2003-06-20 14:45) [4]Вернее сравни одноименные TLB шники на сервере и на клиентe
← →
Serginio (2003-06-20 14:52) [5]Вообще не сталкивался с такими проблемами т.к. для подобного вида структур использую классический подход через VarArrayCreate либо VarByte или VarVariant.
← →
clickmaker (2003-06-20 15:13) [6]Есть еще такой глюк: в recorde есть поле типа WordBool, так вот, на сервере я его ставлю в true, все нормально. Сразу после вызова метода смотрю на клиенте, а оно уже false!
И как там можно вылезти за границы памяти? Разве что WideString, но память под них должна автоматически выделяться, и уж стек поганить то не должна
← →
Юрий Федоров (2003-06-20 15:20) [7]>>clickmaker © (20.06.03 15:13)
А ты проверь,если не сложно: - убери WideString из структуры и посмотри, что получится
← →
Serginio (2003-06-20 15:22) [8]Опять же сравни структуры на сервере и на клиенте. А лучше всего
Serginio (20.06.03 14:52). Без головных болей. Если в первом случае упаковку структуры ты возлагаешь на СОМ то с олевариантными массивами ты сам упаковываешь и распаковываешь.
← →
Юрий Федоров (2003-06-20 15:24) [9]>>Serginio (20.06.03 15:22)
Это решение путем ухода от проблемы :-)
← →
clickmaker (2003-06-20 15:29) [10]Удаление WideString из структуры не помогло. Не буду париться, сделаю через OleVariant
Всем спасибо за участие!
← →
clickmaker (2003-06-20 15:34) [11]Хм... Интересно! Если не использовать в структуре типы WordBool и short, а только Integer, то все работает!
Видимо какие-то типы данных не совместимы с COM
← →
Serginio (2003-06-20 15:43) [12]Выравнивание по границе 4. Хотя они Оле совместимы. Запамятовал а чем отличается SmallInt от ShortInt
← →
clickmaker (2003-06-20 16:06) [13]> Serginio (20.06.03 15:43)
smallint aka short - 2 байта, shortint = byte
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c