При реализации серверов вне процесса COM использует локальный вызов процедуры (LPC). LPC – это средство связи между разными процессами на одной и той же машине. LPC в свою очередь основано на RPC. Стандарт RPC определен в OSF (Open Software Foundation) в спецификации DCE (Distributed Computer Environment) RPC. Описывает взаимодействие удаленных систем с целью вызова процедур.
Процесс, при котором требуется передать параметры из одного адресного пространства в другое. Это процесс называется маршаллингом. Маршаллинг основан на шаблоне Remote Proxy:
· Компонент должен поддерживать интерфейс Imarshal
· У клиента и сервера должны быть библиотеки DLL заместителя (Proxy) и заглушки (Stub) соответственно.
COM предоставляет стандартную реализацию IMarshal, а для некоторых интерфейсов и код заместителей/заглушек.
Реализация маршаллинга
IDL (Interface Definition Language)
Нет необходимости самим заниматься маршаллингом: писать заглушку, заместитель и реализовывать интерфейс IMarshal.
Описав компонент на IDL, после компиляции вы получите реализацию компонента на C/C++ с кодом заглушки/заместителя.
Описание компонента на IDL (интерфейсы)
// Shape.idl
import "unknwn.idl";
[
object,
uuid(73835219-9674-4407-B4A4-7B035F104F63),
helpstring("IShape interface"),
pointer_default(unique)
]
interface IShape: IUnknown
{
HRESULT Draw();
HRESULT DrawText([in, string] wchar_t* szText);
};
Описание компонента на IDL (класс)
[
uuid(651CBD8D-2D5E-4a91-B234-02D536C0AB9D),
helpstring("Компонент рисования прямоугольника"),
version(1.0)
]
coclass Rect
{
interface IShape;
}
// Конец Shape.idl