2012-10-20 4 views
2

Я изучаю, как реализовать COM-сервер вне процесса, и наткнулся на this article.Out-of-process COM-сервер без прокси/заглушки DLL?

Я могу его построить, и он работает нормально, но где же прокси/заглушка DLL? Все, что я вижу, это IDL-файл, из которого генерируется код прокси/заглушки во время сборки. Но как построена DLL, и где она?

ответ

4

Короткий ответ, что все интерфейсы имеют маркировку "oleautomation", так oleaut32.dll выполняет маршалинг, так как COM знает, как для маршалирования всех типов, используемых в интерфейсах.

Если «oleautomation» отсутствовал или был указан тип, который COM не знает, как маршалировать по умолчанию (see the list here), вам понадобится ваш маршалер nefefault и его заглушка.

+0

А, хорошая информация - спасибо! – Dabbler

2

Вам нужен прокси-сервер, чтобы помочь COM-маршалировать ваши интерфейсы. Когда вы создаете проект ATL C++ с Visual Studio, у вас обычно есть дополнительный проект с суффиксом PS, созданным автоматически, и это ваша DLL-прокси-сервер. Тем не менее, вы можете обойтись без него вообще (мне лично никогда не приходилось создавать и использовать его, хотя мне приходилось иметь дело с вещами вроде пользовательского маршалинга). Если вы предоставляете библиотеку типов в своем проекте, она зарегистрирована и соблюдаются определенные условия - COM предоставит вам автоматическую прокси-серверную пару.

чтение Bonus:

+0

Хорошо, спасибо. Я прочитаю ссылки, которые вы предоставили, а так как DLL-прокси/заглушка представляется необязательной, я отвечу на вопрос. Можете ли вы порекомендовать какие-либо книги по изучению СОМ? У меня есть Inside COM от Dale Rogerson, который, как мне кажется, очень хорошо объясняет серверы в процессе работы, но становится немного поверхностным, когда он попадает на серверы в EXE. – Dabbler

+0

Я думаю, что это единственная книга на COM, которую я когда-либо читал, и я думаю, что это было хорошо. Мне было посоветовать что-нибудь еще от манжеты, я полагаю, что можно сделать очень хорошо только с основами, и делать шаги осторожно, понимая, что вы делаете. Серверы EXE на самом деле не так сильно отличаются от in-procs, и все API-интерфейсы хорошо документированы в MSDN. –

+0

Это не так просто, вам все равно нужно зарегистрировать ключи HKCR \ Interface \ {iid} \ ProxyStubClsid32 и TypeLib, чтобы получить стандартный маршаллер, который использует библиотеку типов. CLSID - {00000320-0000-0000-C000-000000000046}. Если вы этого не сделали, и он по-прежнему работает, то высокие шансы, что вы нарушаете правила квартиры, не маршируя указатель интерфейса. –