Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-7526
INCOGNITO
2003-06-21 03:26
2003.07.03
KeyDown Event


6-7581
softmaster
2003-04-27 19:50
2003.07.03
Вопрос по созданию почтового сообщения


14-7604
KOM
2003-06-18 15:48
2003.07.03
Многопоточность


14-7681
Vlad Oshin
2003-06-16 10:58
2003.07.03
Почему компьютер без монитора грузиться, а без видимокарты


1-7427
eLVik
2003-06-23 11:50
2003.07.03
Поиск файлов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский