Подтвердить что ты не робот

Что такое проект PS $Foo в моем решении $Foo ATL?

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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