Для чего нужен проект ($ Foo) PS в моем решении $ Foo ATL?

Вы можете захватить COM-компонент, который использует Diff / Patch / Match от Google . Он работает от .NET.

Обновление, 2010 г. 17 октября. Код Google Diff / Patch / Merge был перенесен на C #. Компонент COM по-прежнему работает, но если вы используете .NET, вы хотите напрямую использовать порт .NET.

24
задан Sideshow Bob 6 March 2012 в 11:26
поделиться

3 ответа

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

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

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

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

36
ответ дан Hans Passant 6 March 2012 в 11:26
поделиться

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

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

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

8
ответ дан Igor Chornous 6 March 2012 в 11:26
поделиться

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

5
ответ дан ebutusov 6 March 2012 в 11:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: