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