Главная страница
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
7-7738
anton_cor
2003-04-22 15:31
2003.07.03
Как получить список процессов из консольного или не имеющего окна


1-7446
OlegL
2003-06-23 15:16
2003.07.03
вызов чужой функции в dll


14-7676
alpine
2003-06-15 13:07
2003.07.03
Помогите с выбором !


7-7726
Ihor Osov'yak
2003-04-21 20:15
2003.07.03
DeviceIoControl,METHOD_BUFFERED и данные по поинтеру Win32,


6-7570
danka
2003-04-25 17:42
2003.07.03
idFTP и id HTTP