Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
8-7566
Link-ov
2003-03-20 16:06
2003.07.03
печать DBChart


1-7391
ОРЕН
2003-06-23 00:35
2003.07.03
chm-справочная система


14-7608
Jumbo
2003-06-17 04:53
2003.07.03
Command line


1-7504
Mishenka
2003-06-20 23:06
2003.07.03
Можно ли в MessageBox вставлять названия кнопок на русском языке?


1-7511
A
2003-06-21 16:54
2003.07.03
Свойство компонента ListBox