Модель программирования Component Object Model. Разработка COM-сервера, страница 11

Для того, чтобы клиент, написанный на любом из перечисленных (элитных) языков, мог вызвать метод интерфейса из COM-объекта, расположенного в рамках другого процесса, несколько компонент должны объединить свои усилия. Прежде всего, это две заглушки (клиентская и серверная). В технологии RPC (Remote Procedure Call) они так и называются. В COM клиентская заглушка называется proxy stub, или просто proxy. Она расположена в адресном пространстве клиента и представляет интересы COM-объекта на стороне клиента, обеспечивая суррогатные точки входа для каждого из методов, обозначенных в исходном IDL-файле. Когда клиент делает вызов удаленной (remote) процедуры сервера, то сначала он вызывает суррогат этой процедуры в заглушке proxy (в пространстве своего процесса). Последняя осуществляет:

¨  Упаковку параметров в буфер сообщения (message buffer) так, чтобы они надежно могли быть доставлены удаленному серверу,

¨  Вызов библиотечной процедуры передачи параметров в адресное пространство сервера,

¨  Распаковку выходных (out) или возвращаемых (retval) параметров и передачу их вызывающей процедуре.

Серверная заглушка, или просто stub, распаковывает (unmarshals) параметры и передает их объекту COM. Она также запаковывает ответную информацию (возвращаемые параметры) для того, чтобы передать их назад клиенту.

Описанные действия называются маршализацией аргументов. Эта процедура сильно зависит от типа параметров. Например, маршализация массива данных значительно сложнее маршализации переменной целого типа или указателя на структуру. Для каждого типа данных существуют свои отдельные функции. Proxy состоит из части, которая размещена в OLE32.DLL (proxy manager) и частей, которые зависят от интерфейсов COM-объекта (interface proxies). Для клиента proxy представляет собой реальный COM-объект.

Сам канал передачи обслуживается функциями библиотеки COM. Канал передает буфер (с маршализованными параметрами) во владение функциям из RPC-библиотеки, которые и занимаются его передачей через границу между процессами. Вы можете выбирать между стандартной маршализацией, обеспечиваемой библиотекой COM, и своей собственной (custom marshaling). В последнем случае вы должны разработать интерфейс, производный от IMarshal. Каждый отдельный интерфейс может пользоваться одним из двух способов маршализации своих параметров. Это определяется на этапе проектирования COM-класса, реализующего интерфейсы. Здесь уместно привести схему, которую вы также можете увидеть в MSDN (Search4Marshaling Details).

Схема коммуникации клиент-сервер

COM не накладывает ограничений на структуру компонет, он определяет лишь порядок их взаимодействия. В основе межпроцессной коммуникации лежит все та же косвенная адресация (таблица виртуальных функций), которая позволяет передать управление либо прямо методу интерфейса (inproc-server), либо его представителю (proxy) на стороне клиента, который, в свою очередь делает RPC (удаленный вызов) метода настоящего объекта. Прозрачность COM-объекта для клиента заключается в том, что proxy-объект знает, где расположен реальный объект (на другом компьютере — remote server, или на том же самом — local server), а клиент об этом не знает.

Библиотека типов

Для того, чтобы клиенты, разработанные на других языках программирования, могли управлять объектами сервера, они должны иметь информацию о типах данных, используемых сервером при передаче параметров. Одним из способов получения этой информации является создание сервером библиотеки типов. Возвращаясь к файлам, которые сгенерировал компилятор MIDL, отметим, что он создает еще один (двоичный) TLB-файл (Type Library). После успешной компиляции вы можете обнаружить его в папке Debug. COM использует этот файл для реализации маршалинга, управляемого данными, который происходит на этапе выполнения программы.