Интерфейсные заместители и интерфейсные заглушки динамически связываются и совместно используют единый CLSID как для заместителя, так и для заглушки. Такую раздвоенную реализацию часто называют интерфейсным маршалером (interface marshaler). Объект класса интерфейсного маршалера выставляет интерфейс IPSFactoryBuffer:
[ uuid(D5F569DO-593B-101A-B569-08002B2DBF7A), local, object ] interface IPSFactoryBuffer : IUnknown { HRESULT CreateProxy( [in] IUnknown *pUnkOuter, // ptr to proxy manager // указатель на администратор заместителей [in] REFIID riid, // the requested itf to remote // запрошенный интерфейс для удаленного доступа [out] IRpcProxyBuffer **ppProxy, // ptr. to proxy itf. // указатель на интерфейс заместителя [out] void **ppv // ptr to remoting interface // указатель на удаленный интерфейс );
HRESULT CreateStub( [in] REFIID riid, // the requested itf to remote // запрошенный интерфейс для удаленного доступа [in] IUnknown *pUnkServer, // ptr to actual object // указатель на действующий объект [out] IRpcStubBuffer **ppStub // ptr to stub on output // указатель на заглушку на выходе ); }
Администратор заместителей вызывает метод CreateProxy с целью агрегирования нового интерфейсного заместителя. Администратор заглушек вызывает метод CreateStub с целью создания новой интерфейсной заглушки.
Когда в объекте запрашивается новый интерфейс, то администраторы заместителей и заглушек должны преобразовать запрошенные IID и CLSID интерфейсного маршалера. Под Windows NT 5.0 хранилише класса совершает эти преобразования в директории NT, и они кэшируются в локальном реестре каждой хост-машины. Отображения IID в CLSID всей машины кэшируются в
HKEY_CLASSES_ROOT\Interface
а отображения каждого пользователя кэшируются в
HKEY_CURRENT_USER\Software\Classes\Interface