Для чего нужен проект ($ Foo) PS в моем решении $ Foo ATL? - PullRequest
24 голосов
/ 06 марта 2012

Создание проекта ATL в MSVC, кажется, создает не один, а два проекта; последний назван так же, как первый, но с добавлением PS к его имени. Какова цель этого второго проекта и как я могу определить, нужен ли он мне?

Ответы [ 3 ]

36 голосов
/ 06 марта 2012

COM поддерживает вызовы метода интерфейса для двух разных потоков, двух разных процессов или двух разных машин.Это называется маршалинг .Два разных потока - наиболее распространенный случай, COM-сервер часто не является потокобезопасным.COM реализует поточную безопасность для таких однопоточных коклассов, направляя вызов из «неправильного» потока в поток, создавший сервер.Маршалинг между процессами происходит, когда вы пишете внепроцессный сервер.Между разными машинами в сети это называется DCOM.

Это реализуется путем создания экземпляра интерфейса, который выглядит точно , как оригинал.Но все методы интерфейса на самом деле являются заменителями, которые выполняют маршалинг вызова.Это прокси.На другом конце провода есть замена, которая выглядит точно как интерфейс, но выполняет противоположную работу.Это заглушка.Прокси и заглушка работают вместе, создавая иллюзию, что вы делаете простой вызов метода в вашей программе.

Основная задача прокси состоит в сериализации аргументов вызова метода в буфер памяти или сетьпакет.Это может быть довольно нетривиальным, особенно когда вы используете указатели на структуры переменного размера.COM нуждается в помощи, чтобы понять это правильно, и это работа вашего проекта FooPS.Когда вы запускаете midl.exe для вашего .idl-файла, midl автоматически генерирует код из определений интерфейса для реализации прокси и заглушки.Это довольно часто достаточно хорошо, но вам может потребоваться реализовать свои собственные, если встроенные ключевые слова в midl недостаточны для описания ваших данных.

И последнее, но не менее важное: Windows предоставляет стандартный маршаллер, который может упростить маршалинг.интерфейсы.Разработан для поддержки подмножества COM, определенного COM Automation.Другими словами, интерфейсы, которые являются производными от IDispatch и используют только типы, совместимые с Automation.Вам нужно только получить правильные записи в реестре, чтобы включить его, и в противном случае вам не нужен прокси / заглушка, сгенерированный midl.И, конечно, если вы выполняете простые внутрипроцессные вызовы только в одном потоке, он вам тоже не понадобится.Это довольно часто.

8 голосов
/ 06 марта 2012

Как сказал @ebutusov, * проект PS содержит реализации для Proxy и Stub . Они не являются стандартными, вместо этого они генерируются MIDL для интерфейсов, экспортируемых с вашего сервера ATL. Эти интерфейсы объявлены в файле * .IDL. Выход проекта - DLL. Вы можете прочитать эту статью , чтобы получить более подробную информацию.

Вы можете удалить проект PS из решения в случае, если вы не определяете какие-либо пользовательские интерфейсы в своем файле * .IDL или определяете только интерфейсы, которые имеют модификаторы dual и oleautomation. В этом случае будет использоваться стандартный маршаллер typelib.

Чтобы использовать стандартный маршаллер typelib, необходимо зарегистрировать библиотеку типов (что делается автоматически, так как вы используете ATL)

5 голосов
/ 06 марта 2012

Это код прокси / заглушки, который содержит нестандартные маршаллеры данных, необходимые для передачи данных между различными квартирами (связанные с многопоточностью).Он используется, когда приложение, которое вызывает ваш COM-объект, использует другую модель COM-потоков.В мастере ATL / COM была возможность слить этот код в основную библиотеку.Во многих распространенных сценариях вам не нужно об этом беспокоиться (например, когда ваша dll COM работает в контексте клиента), если вы не хотите написать собственный маршаллер.

...