Передача структур
От: Parfenov Denis  
Дата: 04.01.02 11:31
Оценка:
Может кто нибудь посоветует каким образом лучше передать структуру через COM, я пробовал двумя способами (1-VARIANT, 2-SAFEARRAY), все работает нормально, но все же хочется узнать и про другие существующие варианты передачи структуры.

Заранее спасибо.
Re: Передача структур
От: Sergey Россия  
Дата: 04.01.02 12:07
Оценка:
Здравствуйте Parfenov Denis, Вы писали:

PD>Может кто нибудь посоветует каким образом лучше передать структуру через COM, я пробовал двумя способами (1-VARIANT, 2-SAFEARRAY), все работает нормально, но все же хочется узнать и про другие существующие варианты передачи структуры.

Ну вот тебе еще способ: пишешь 2 функции, одна твою структуру сохраняет в std::ostream, другая — читает из std::ostream. Пишешь
наследника от std::streambuf (или std::basic_streambuf) для работы с IStream и для удобства — специализацию от std::ostream/std::istream для твоего стримбуфера (назовем их пока oolestream/iolestream). Если надо структуру передать через COM, сохраняешь ее в oolestream, через COM передаешь IStream с запиханной в него структурой, на другом конце конструируешь iolestream из IStream, загружаешь структуру. Достоинства и недостатки очевидны.

PD>Заранее спасибо.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Передача структур
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.01.02 21:42
Оценка:
Здравствуйте Parfenov Denis, Вы писали:

PD>Может кто нибудь посоветует каким образом лучше передать структуру через COM, я пробовал двумя способами (1-VARIANT, 2-SAFEARRAY),


А зачем VARIANT то? Можно и сами структуры в параметры заносить.

PD>все работает нормально, но все же хочется узнать и про другие существующие варианты передачи структуры.


Можно и на мидловских заглушках. Но это плохое решение:


Выглядит примерно так:

typedef struct 
{
  int fld1;
  int fld2;
} Struct;

...

HRESULT Func1([in] Struct * pStruct);


Массивы можно задавать фиксировано или через size_is.

Подробнее см. раздел по MIDL в MSDN.


PS

Только я лично не советую пользоваться этим способом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Передача структур
От: VD Россия  
Дата: 08.01.02 12:29
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Выглядит примерно так:


VD>
VD>typedef struct 
VD>{
VD>  int fld1;
VD>  int fld2;
VD>} Struct;

VD>...

VD>HRESULT Func1([in] Struct * pStruct);
VD>


Только в таком случае все поля структуры должны быть "простых" типов.
Re[2]: Передача структур
От: George_Seryakov Россия  
Дата: 08.01.02 14:10
Оценка:
Здравствуйте Sergey, Вы писали:


S> Ну вот тебе еще способ: пишешь 2 функции, одна твою структуру сохраняет в std::ostream, другая — читает из std::ostream. Пишешь

S>наследника от std::streambuf (или std::basic_streambuf) для работы с IStream и для удобства — специализацию от std::ostream/std::istream для твоего стримбуфера (назовем их пока oolestream/iolestream). Если надо структуру передать через COM, сохраняешь ее в oolestream, через COM передаешь IStream с запиханной в него структурой, на другом конце конструируешь iolestream из IStream, загружаешь структуру. Достоинства и недостатки очевидны.

Нэнавижу!!! У меня в системе один из интерфесов такой. Для тех, кто считает, что недостатки "очевидны", предлагается обдумать установки секьюрити для вызова такого интефейса по DCOM-у через границы домена (т.е. когда клиент и сервер находятся в разных доменах, не связанных отношениями доверительности).
GS
Re[3]: Передача структур
От: Sergey Россия  
Дата: 08.01.02 14:45
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Здравствуйте Sergey, Вы писали:



S>> Ну вот тебе еще способ: пишешь 2 функции, одна твою структуру сохраняет в std::ostream, другая — читает из std::ostream. Пишешь

S>>наследника от std::streambuf (или std::basic_streambuf) для работы с IStream и для удобства — специализацию от std::ostream/std::istream для твоего стримбуфера (назовем их пока oolestream/iolestream). Если надо структуру передать через COM, сохраняешь ее в oolestream, через COM передаешь IStream с запиханной в него структурой, на другом конце конструируешь iolestream из IStream, загружаешь структуру. Достоинства и недостатки очевидны.

GS> Нэнавижу!!! У меня в системе один из интерфесов такой. Для тех, кто считает, что недостатки "очевидны", предлагается обдумать установки секьюрити для вызова такого интефейса по DCOM-у через границы домена (т.е. когда клиент и сервер находятся в разных доменах, не связанных отношениями доверительности).


Вот такое пока ни разу не делал. И чем же вызов метода такого интерфейса отличается от передачи SAFEARRAY в плане секьюрити, если не секрет?
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: Передача структур
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.02 19:49
Оценка:
Здравствуйте VD, Вы писали:

VD>Только в таком случае все поля структуры должны быть "простых" типов.


С чего бы это?

Поля могут быть любых типов поддерживаемых мидл-ом. Массивы естественно должны бить или фиксированной длинны или с длинной заданой через атрибуты size_is/lenght_is.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Передача структур
От: VD Россия  
Дата: 14.01.02 08:38
Оценка:
Здравствуйте VladD2, Вы писали:

VD>С чего бы это?


VD>Поля могут быть любых типов поддерживаемых мидл-ом. Массивы естественно должны бить или фиксированной длинны или с длинной заданой через атрибуты size_is/lenght_is.


Вот об этом я и говорил, поскольку все это достаточно простые типы.
Re[5]: Передача структур
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.01.02 09:32
Оценка:
Здравствуйте VD, Вы писали:

VD>Здравствуйте VladD2, Вы писали:


VD>>С чего бы это?


VD>>Поля могут быть любых типов поддерживаемых мидл-ом. Массивы естественно должны бить или фиксированной длинны или с длинной заданой через атрибуты size_is/lenght_is.


VD>Вот об этом я и говорил, поскольку все это достаточно простые типы.


Ну, если масивы, структуры и объеденения являются простыми тимами (!), то что же по твоему является сложными?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Передача структур
От: VD Россия  
Дата: 14.01.02 10:29
Оценка:
Здравствуйте VladD2, Вы писали:

VD>>>Поля могут быть любых типов поддерживаемых мидл-ом. Массивы естественно должны бить или фиксированной длинны или с длинной заданой через атрибуты size_is/lenght_is.


VD>Ну, если масивы, структуры и объеденения являются простыми тимами (!), то что же по твоему является сложными?


Ключевым словом тут является поддерживаемых мидл-ом, т.е. как я понимаю VARIANT-совместимых и их комбинаций. А сложными я бы назвал, например, STL-e типы или MFC-е.
Re[4]: Передача структур
От: George_Seryakov Россия  
Дата: 14.01.02 18:59
Оценка: 6 (1)
Здравствуйте Sergey, Вы писали:

S>>> Если надо структуру передать через COM, сохраняешь ее в oolestream, через COM передаешь IStream с запиханной в него структурой, на другом конце конструируешь iolestream из IStream, загружаешь структуру. Достоинства и недостатки очевидны.


GS>> Нэнавижу!!! У меня в системе один из интерфесов такой. Для тех, кто считает, что недостатки "очевидны", предлагается обдумать установки секьюрити для вызова такого интефейса по DCOM-у через границы домена (т.е. когда клиент и сервер находятся в разных доменах, не связанных отношениями доверительности).


S> Вот такое пока ни разу не делал. И чем же вызов метода такого интерфейса отличается от передачи SAFEARRAY в плане секьюрити, если не секрет?


Когда передаешь SAFEARRAY нужно дать права на использование только вызываемого объекта. Когда передаешь IStream (объект!), то нужны права и на использование этого объекта. Причем этот самый айстрим может не принадлежать ни к какому приложению, имеющему AppId. В этом случае права даются в дефолтовом секьюрити. Когда домены разные и не связанные доверительностью, все айдентити нужно удваивать. Не сбился? Тогда скажи мне в скольких местах нужно делать настройку, если на клиенте и сервере разные айдентити?
GS
Re[7]: Передача структур
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.01.02 19:35
Оценка: 9 (1)
Здравствуйте VD, Вы писали:

VD>Здравствуйте VladD2, Вы писали:


VD>>>>Поля могут быть любых типов поддерживаемых мидл-ом. Массивы естественно должны бить или фиксированной длинны или с длинной заданой через атрибуты size_is/lenght_is.


VD>>Ну, если масивы, структуры и объеденения являются простыми тимами (!), то что же по твоему является сложными?


VD>Ключевым словом тут является поддерживаемых мидл-ом, т.е. как я понимаю VARIANT-совместимых и их комбинаций. А сложными я бы назвал, например, STL-e типы или MFC-е.


Ключевым словом тут является поддерживаемых мидл-ом, т.е. как я понимаю VARIANT-совместимых и их комбинаций. А сложными я бы назвал, например, STL-e типы или MFC-е.

Ну, тогда на бедующее запомни. В COM сложными типами данных называют структуры, объединения и массивы. Короче, описываемые программистом.

STL-e типы и MFC-е (короче, классы), в прочем как и любые другие типы несовместимые с MIDL в COM использоваться не могут, а потому никак и не называются.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Передача структур
От: VD Россия  
Дата: 15.01.02 07:05
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Ну, тогда на бедующее запомни. В COM сложными типами данных называют структуры, объединения и массивы. Короче, описываемые программистом.

Тут мне, наверное, следовало бы спросить тебя об источнике, из которого взято это определение, но я этого делать не буду, поскольку твоя позиция мне понятна.

VD>STL-e типы и MFC-е (короче, классы), в прочем как и любые другие типы несовместимые с MIDL в COM использоваться не могут, а потому никак и не называются.

Я думаю нет никакого смысла в дальнейшем разговоре на эту тему. Мы говорим об одном и том же, но немного разными словами, смысл от этого не меняется — это типа как бегемот и гиппопотам — слова разные, а смысл один.
Т.ч. удачи.
Re[9]: Передача структур
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.01.02 10:48
Оценка:
Здравствуйте VD, Вы писали:

VD>Здравствуйте VladD2, Вы писали:


VD>... следовало бы спросить тебя об источнике...


Документация по пидлу и oleautomation.

PS

Проблема терминологии в том, что называя понятия не принятыми словами легко ввести человека в заблуждение или начать спорить на пустом месте. Посмотри постинги Рыбинкина на ixbt...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Передача структур
От: dad  
Дата: 10.05.02 14:31
Оценка:
VD>>Ключевым словом тут является поддерживаемых мидл-ом, т.е. как я понимаю VARIANT-совместимых и их комбинаций. А сложными я бы назвал, например, STL-e типы или MFC-е.

VD>Ключевым словом тут является поддерживаемых мидл-ом, т.е. как я понимаю VARIANT-совместимых и их комбинаций. А сложными я бы назвал, например, STL-e типы или MFC-е.


VD>Ну, тогда на бедующее запомни. В COM сложными типами данных называют структуры, объединения и массивы. Короче, описываемые программистом.


VD>STL-e типы и MFC-е (короче, классы), в прочем как и любые другие типы несовместимые с MIDL в COM использоваться не могут, а потому никак и не называются.


Надо бы вопрос о типах COM|DCOM поместить в QA.. прям раздел назвать типы мидл..
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.