COM marshalling, документация и все, все, все...

Все-таки, наверное, Европейский Суд не зря судит Microsoft за недостаточно хорошую документацию. Пытаясь разобраться как, все таки, написать proxy для интерфейса IShellLinkDataList (см. предыдущие посты: COM Marshalling. и Shortcuts, shell and COM apartments.), перечитал уйму документации, пока не нашел толкового описания того, что я хочу сделать на сайте Dr. Dobb’s. Если попытаться описать весь процесс “метаний”, то выглядело это так:

Началось всё с идеи написать .idl с описанием интерфейса, сгенерировать proxy и stub и собрать dll. Однако с ходу это не заработало из-за того, что IShellLinkDataList::CopyDataBlock возвращает указатель на выделенный блок переменного размера, который нужно освобождать вызовом LocalFree.

Выяснив в MSDN как, собственно, работает marshalling, я уже было начал писать полностью свой proxy. Впрочем вскоре в голову пришла разумная мысль, что не может быть все так плохо и должен существовать способ кастомизировать то, что герерирует MIDL. Снова полез в MSDN.

Долго ли, коротко ли, увидел упоминание функций midl_user_allocate и midl_user_free. Подумал - вот оно! Оказалось - ничего подобного. Мне даже не удалось заставить компилятор использовать эти функции. Подозреваю, что их использование ограничивается RPC и когда речь идет о COM интерфейсах они не используются. Всё таки для меня это темный лес. :-(

Продолжая копаться в MSDN и проклиная все на свете, нашел наконец статью, про MIDL аттрибут wire_marshal, который, как я понимаю, и нужно использовать вклинивания в процесс передачи параметров.

Вот здесь, по идее, я должен был, наконец, быстренько написать рабочий код, изредка сверяясь с MSDN. Как бы не так. В MSDN этот вопрос освещен настолько мутно, что ни черта не понятно как же все таки использовать этот грешный аттрибут. Вдумчивое штудирование “wtypes.idl” из Platform SDK, который вовсю использует wire_marshal для сходных целей не помогло. Помогло только найденная статься в Dr. Dobb’s, о которой я упоминал выше.

Так вот к чем это я все. На протяжении всего процесса поисков меня не покидало ощущение, что все на что годна документация - это перечисление названий всех функций, аттрибутов и ключей компилятора. Чего не хватало, так это внятного (да хоть какого-нибудь) описания как все описанные вещи взаимодействуют друг с другом. Толковые описания - те которые не толкут воду в ступе несколько страниц и описывают важные детали вместо ссылок на оглавление функций - можно пересчитать по пальцам однй руки и позаимствованы они из различных книг или статей. Т.е. изначально они не часть MSDN и попали они туда, потому что своих нет. При всем при этом сама реализация “в коде” и возможности, которые она предоставляет, впечатляет. Видно, что разработчики подумали о самых разных вещах и ситуациях. В общем есть еще над чем работать. :-(

comments powered by Disqus