Re[5]: Универсальный маршалинг
От: ant_katcin Россия  
Дата: 18.07.06 17:08
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, Аноним, Вы писали:


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


AJD>>>>Здравствуйте, Аноним, Вы писали:


А>>>>>Рзбираясь с архитектурой возник следующий вопросик... В случае стандартного маршалинга компилятор MIDL генерит проксю/заглушку которая является обьъектом с поддержкой маршалирумого интерфейса. Соответственно для создания прокси активируется объект с IID прокси и объект заглушки, которые живут в этой dll. Тут всё понятно. Непонятно каким образом осуществляется маршалинг через универсальный механизм автоматизации когда для любого объекта используется одна и таже универсальная прокся/заглушка. Если вызов осуществляется через диспатч, то понятно что объект с поддержкой iDispatch зашит в универсальную dll, а если выхов идёт через кастом интерфейс или в качесте параметров передаются кастомные интерфейсы то как всё работает?


AJD>>>>Если ты про typelib маршалинг — то только стандартные типы и интерфейсы(IDispatch) автоматически маршалятся.


А>>>Делаю произвольный интерфес с поддержкой диспатча, дёргаю из С++ кода методы этого объекта через raw интерфейс — всё нормально маршалится, как это происходит?


КЛ>>давай подробнее, как делаешь, что делаешь


А>Пример:

А>делаю outproc сервер с объектом с поддержкой IDraw
А>
А>interface IDraw: IDispatch {
А>   [id(1), helpstring("method Draw")] HRESULT Init([in] BSTR txt);
А>}
А>


А>В коде делаю


А>
А>   IDrawPtr pObj = NULL;
А>   pObj.CreateInstance(__uuidof(Draw));
   pObj->>Init(_bstr_t("Hi"));
А>


А>Каким образом создаётся прокся и реализуется вызов метода?


Универсальный маршаллинг использует заглушки из oleaut32.dll. Использует он эту заглушку если для интерфейса стоит аттрибут IDL [oleautomation]
Сказать каким образом эти заглушки маршалят все variant-совместимые интерфейсы я не могу,т.к. не знаю. Конечно можно пофантазировать, но я воздержусь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.