Ответ 1
COM поддерживает вызовы методов интерфейса в двух разных потоках, двух разных процессах или двух разных машинах. Это называется маршалингом. Наиболее распространенным случаем является два разных потока: COM-сервер часто не является потокобезопасным. COM реализует безопасность потоков для таких однопоточных коккалей путем марширования вызова из "неправильного" потока в поток, который создал сервер. Марширование между процессами происходит, когда вы пишете сервер вне процесса. Между разными машинами по сети называется DCOM.
Это реализуется путем создания экземпляра интерфейса, который выглядит точно так же, как оригинал. Но все методы интерфейса на самом деле являются заменителями, которые выполняют задачу маршалинга вызова. Это прокси. На другом конце провода есть замена, которая выглядит точно так же, как интерфейс, но выполняет противоположное задание. Это заглушка. Прокси-сервер и заглушка работают вместе, чтобы создать иллюзию, что вы делаете простой вызов метода в своей программе.
Основная задача прокси-сервера заключается в сериализации аргументов вызова метода в буфер памяти или сетевой пакет. Это может быть довольно нетривиальным, особенно если вы используете указатели для структур с переменным размером. COM нуждается в помощи, чтобы получить это право и что работа вашего проекта FooPS. Когда вы запускаете файл midl.exe в вашем .idl файле, midl автоматически генерирует код из определений интерфейса для реализации прокси-сервера и заглушки. Это довольно часто достаточно хорошо, но вам может потребоваться реализовать свои собственные, если встроенных ключевых слов в midl недостаточно для описания ваших данных.
И последнее, но не менее важное: Windows предоставляет стандартный маршаллер, который может объединять простые интерфейсы. Предназначен для поддержки подмножества COM, определенного программой COM Automation. Другими словами, интерфейсы, которые происходят из IDispatch и используют только совместимые с Automation типы. Вам нужно только получить записи реестра, чтобы включить его, и в противном случае не нужен прокси-сервер, сгенерированный midl. И, конечно, если вы делаете только простые вызовы в одном потоке, вам это тоже не понадобится. Это довольно часто.