о суті, це той же GUID) і вказує на інший покажчик, який, у свою чергу, вказує на таблицю, яка містить адреси реалізації кожної функції з цієї групи ( рис.8).
В
Рис. 8 - Структура інтерфейсу
Ця структура дозволяє забезпечити маршалинга - пересилку покажчика між процесами (і в загальному випадку між комп'ютерами).
Реалізація інтерфейсу COM-об'єкта являє собою створення в пам'яті подібної структури та надання покажчика на неї. Фактично така структура схожа на структуру, що використовується для побудови таблиць віртуальних функцій в C + +, тому таблиця покажчиків на функції в цій структурі іноді називається "vtable" (або таблицею віртуальних методів). p align="justify"> Досить істотно, що адреси самих функцій визначаються на етапі виконання за допомогою покажчика на інтерфейс у момент звернення до них, а не зберігаються в пам'яті статично. Відзначимо також, що за наявності покажчика на функцію в таблиці покажчиків завжди існує і її реалізація, тому клієнт не повинен ні обробляти повідомлень про звернення до неіснуючих функціями, ні мати власної версії їх реалізації. p align="justify"> Коли клієнтові потрібна COM-об'єкт, він намагається знайти сервер, посилає серверу запит на створення об'єкта, а потім одержує від нього покажчик на вихідний інтерфейс, за допомогою якого можна отримати додаткові покажчики на інші інтерфейси цього об'єкта. знаходить місце розташування сервера на підставі запису в реєстрі, завантажує його в оперативну пам'ять, запитує у сервера потрібний об'єкт (ініціюючи його створення) і отримує покажчик на інтерфейс. Якщо сервер і клієнт виконуються в різних процесах, COM автоматично передає покажчик на інтерфейс в процес клієнта. p align="justify"> маршалинга і віддалений доступ
Якщо сервер є внутрішнім ("in-process"), тобто виконаним у вигляді DLL, вона завантажується в адресний простір клієнта за допомогою функції Win32 API LoadLibrary. У цьому випадку значення покажчика на інтерфейс безпосередньо доступно клієнту. p align="justify"> Якщо сервер локальний, COM використовує функцію CreateProcess, завантажуючи виконуваний файл і ініціалізувавши COM в адресному просторі останнього. Потім COM в процесі сервера зв'язується з COM в процесі клієнта яких-небудь доступним способом. У цьому випадку зазвичай немає можливості передати клієнту точне значення покажчика на інтерфейс, так як це покажчик на об'єкт в іншому адресному просторі. У цьому випадку використовується маршалинга, що створює так званий "marshalling packet", що містить необхідну інформацію для з'єднання з процесом, в якому створено об'єкт. Цей пакет створюється за допомогою функції COM API CoMarshalInterface, потім він передається процесу клієнта будь-яким доступним способом, де інша функція CoUnMarshalInterface перетворює цей пакет в покажчик на інтерфейс. Насправді маршалинга створює в обох адресних ...