Как стать автором
Обновить

Комментарии 43

COM и тем более на ATL разве кто-то еще пишет?
пишет :)
COM-интерфейсы имеют LzmaSdk (aka 7z api), .NET Hosting API, в виде COM-компонента оформлен DirectX…

Кроме того, COM был и остается способом «по умолчанию» для универсального взаимодействия между исполнимыми модулями, написанными на разных языках, в тех случаях, когда простых экспортируемых функций становится недостаточно.
Интересно, в каких случаях может быть недостаточно простых экспортируемых функций? Они же позволяют передавать между модулями любые данные и даже код…
ИМХО, COM — классический пример оверинжениринга, заставляющий для простейших действий писать тонны маловразумительного кода. Абсолютно везде COM-архитектуру можно было бы заменить обычными DLL, вместо того чтобы городить огород с регистрацией в реестре, GUID'ами, моникерами и COM-серверами.
Если так уж хотелось классовой обёртки, чтобы через "->" можно было к функциям обращаться, то можно было бы сделать классовую обёртку непосредственно в хеадерах, тем более что там и так вся метаинформация ручками набита (спрашивается, на кой вообще придумали IDL, если всё равно инфа дублируется в хеадерах?).
Похоже на то, что COM исходно задумывался для потенциально опасного (недоверенного) кода — например, кода Internet-апплетов. Все эти подписи, GUID'ы, регистрация — очень уж напоминают движение в сторону restricted-кода, который выполняется в песочнице с жёстким контролем доступа. Но в итоге продукт получился весьма сырым и недоработанным.
COM это в первую очередь бинарный стандарт для межплатформенного(или если выражаться прямее — межъязыкового, в плане языков программирования), межпроцессного и даже сетевого(DCOM) взаимодействия.

В JS и VB нет «хеадеров», в C# их тоже нет, и уж точно их нет в каком-нибудь Common Lisp. Модульность во всех трех реализована совершенно по-разному. Зато и там и там и в третьем, и даже в четвертом, есть более-менее похожее ООП.

Кроме того, COM это некоторая такая попытка пофиксить недостатки C++ — а именно: отсутствие ABI, управление памятью, модель ООП и отсутствие reflection.
Простых экспортируемых функций недостаточно, когда продукт постоянно развивается. Через некоторое время возникнет нехороший эффект версионности. Короче — dll hell.
Интересно, в каких случаях может быть недостаточно простых экспортируемых функций? Они же позволяют передавать между модулями любые данные и даже код…


В случае сложного объектно-ориентированного API, разумеется. Я привел три примера, которые в виде простых экспортируемых функций стали бы абсолютным кошмаром.

ИМХО, COM — классический пример оверинжениринга, заставляющий для простейших действий писать тонны маловразумительного кода. Абсолютно везде COM-архитектуру можно было бы заменить обычными DLL, вместо того чтобы городить огород с регистрацией в реестре, GUID'ами, моникерами и COM-серверами.


Обязательный элемент среди вами перечисленных — GUID'ы. Возможно, вы удивитесь, но все остальное глубоко опционально.

Если так уж хотелось классовой обёртки, чтобы через "->" можно было к функциям обращаться, то можно было бы сделать классовую обёртку непосредственно в хеадерах, тем более что там и так вся метаинформация ручками набита (спрашивается, на кой вообще придумали IDL, если всё равно инфа дублируется в хеадерах?).

Затем, что C++ — это далеко не единственной язык программирования! Мне вот другое не понятно, зачем TLB придумали…
Судя по всему, вы юзаете COM. Удивительно, что вы не знаете о TLB. Впрочем, наверное, просто никогда особо не интересовались. TLB хранит информацию о типах (метаинформацию). Она нужна, например, для автоматического маршалинга, когда на основе TLB генерятся proxy & stub. TLB нужна для загрузки COM-компонента в среде, которая не имеет никакой информации о самом компоненте. Например, директива #import, которая «кушает» dll и генерит tli/tlh хидеры со всеми интерфейсами, гуидами и прочими необходимыми вещами на самом деле работает с type library, вкомпиленной в DLL. Другие языки (не С++) тоже таким образом работают с бинарными компонентами.
Все тоже самое хранится и в IDL-файле. TLB по сути — всего лишь его двоичное представление.
Да, так и есть. Я не совсем понимаю суть вашего возражения. Или это просто констатация факта? В idl вы описываете типы, потом использвуется midl, компилятор IDL, который переводит все в бинарную форму и это добро вкомпиливается в длл. Или вы считаете, что все должно храниться в текстовом виде?
Да, это машиночитаемое представление, которое в runtime используется средой исполнения COM, например, для автоматического маршалинга.
Вы глубоко удивитесь, но GUID — тоже опционально. А вот QueryInterface — обязательно :-)
QueryInterface принимает тот самый GUID обязательным параметром…
:-) тут уж не поспоришь
Для нас COM в первую очередь — компонентная архитектура. Она позволяет достичь модульности и независимости компонентов друг от друга.
COM на самом деле тяжеловесен и громоздок, но при работе над крупным многокомпонентным проектом открывается, что это всё нужно.
Я думаю, что если бы у нас не было COM, то мы бы придумали какой-нибудь его недоработанный аналог.
CORBA в принципе тоже подошла, но тогда бы был отдельный геморрой интеграции с .NET.
Windows Runtime — даже не само новое API, а новый подход к API от Microsoft — это как раз таки COM (с небольшой подтяжкой морщин типа неймспейсов, отсутствия множественного наследования и пр..).

Что до ATL — вполне нормальная библиотека (на чем же еще COM писать?). Ее связь с WRL (новой темплейтной библиотекой для работы с COM/WinRT для тех, кто не хочет использовать C++/CX) значительно менее очевидна, чем между парой COM/WinRT, но все равно чувствуется значительное влияние ATL на WRL.
Десять лет, десять долгих лет я ждал этой статьи…
Бррр, хочу это развидеть! Код с комом вызвал ужасные воспоминания (не как MFC конечно, но тоже мало приятного). К счастью, уже много лет не приходилось возиться с com-ом и надеюсь, что больше не придется.
Почему?
Почему что?
Почему надеетесь. Помимо того, что «computers suck» какие Ваши претензии к COM?
Уродливая технология, которая портит архитектуру даже клиентов не говоря уже о провайдерах com-компонентов. Уродливый синтаксис и конвенции, ужасная система регистраций, гуйдов и прочей фигни, плохо соответствует и ложится на принципы ООП, полностью платформо-зависимая и вообщем-то совершенно ненужная при наличии тонны других способов взаимодействия между компонентами и процессами. Да, иногда не остается выбора работая со сторонними компонентами (в основном майкрософтовскими), но внутри своей собственной архитектуры я бы ни за что в жизни эту дрянь не стал бы брать.
Другими словами, Вы сами не знаете что Вам не нравится — лучше уж «тонна других способов» (aka «зоопарк велосипедов»), чем одна стандартная, невероятная гибкая, крайне логичная (если не залазить в дебри, но подобные дебри остались бы дебрями независимо от того, на какой компонентной модели они построены), оттестированная на миллионах сценариев использования и на сотнях миллиардов пользователей (кумулятивно за последние 20 лет). Ах, да, COM кроме масштабирования «вверх» (всякие связывания-с-моникерами-на-удаленной-машине-используя-кастомные-маршалеры-и-кастомные-транстпортные-протоколы), очень хорошо масштабируется «вниз» (graceful degradation): можно сделать
class MyObject: public IUnknown {
//...
}

с пустой реализацией AddRef и Release и это уже COM объект, который можно передавать куда угодно. Никакой регистрации. GUID — это просто 128-битное случайное число, которое гарантированно глобально-уникально. Все. Что Вам не нравится в глобально уникальных случайных идентификаторах? Синтаксис и конвенции — это где? В IDL? Расскажите больше. «Плохо соотетствует и ложится на принципы ООП» — это глупость. А «полностью платформо-зависимая» — так и вообще идиотизм.

А вообще, немного почитав Ваши комментарии/посты, «что-то» мне подсказывает, что дело вовсе даже и не в технологии (у меня есть ОГРОМНЫЕ подозрения, что Вы в ней даже и не пытались разбираться) — дело в производителе. Все, конечно, не так запущено как в случае amarao, но тенденция тоже отлично просматривается.
На всякий случай поправлюсь, чтоб не придирались к словам.
… это уже COM объект...

Это конечно же класс, а не объект. Объект можно инстанцировать («активировать» в терминах COM) любым понравившимся способом: хоть на стеке, хоть в куче, хоть в data секции и управлять его временем жизни хоть вручную, хоть отдельным самопальным счетчиком ссылок, хоть настоящим сборщиком мусора.

COM — это прежде всего QueryInterface + жесткий ABI, а весь COM рантайм с маршалерами, апартментами, моникерами, регистрацией/активацией — это просто хелперы. Они призваны УПРОЩАТЬ жизнь, если эта функциональность нужна, а не усложнять требованием обязательно реализовывать все известные человечеству интерфейсы. Простейший пример: «классический» COM, Windows Runtime и registration-free COM имеет три совершенно разных способа активации компонентов, но при это все три между собой бинарно совместмы после того, как активация произведена.
Я действительно сильно глубоко в com не копал, но работая в windows тоже волей не волей приходилось сталкиваться, и уж точно не могу сказать что это «гибкая и логичная» система, и уж точно не «стандартная» так как опять-таки привязана к конкретной платформе (потрудитесь объяснить, почему это «идиотизм»?).

>«Плохо соотетствует и ложится на принципы ООП» — это глупость
Глупость? Хехе. Видимо вы никогда не пытались объектно ориентированную архитектуру экспортировать в ком :) Наследование ком-интерфейсов — это нечто странное, но не как не стандартное «is-a» отношение. COM не умеет многих стандартных фич из ООП языков как множественное наследование от классов или интерфейсов, полиморфизм, перегрузка и т.д. Да, на ком можно легко наложить какой-нибудь простенький недокласс (данные+функции) но никак не не более — все остальное это жуткая головная боль и тонны костылей.

>дело в производителе
И у меня нет предвзятости к майкрософту, но есть предвзятость к закрытым платформо-зависимым решениям вроде COM. Просто я много писал (и пишу) кросспатформенный код и занимаюсь портированием, и не раз сталкивался, когда с ситуацией, когда портирование многократно усложнялось, из за наличия вот такой вот хрени. Единственная претензия к Майкрософту, что они любят проталкивать свои собственные костыли под видом «стандарта», после чего толпы виндузятных программистов понятия не имеют, где заканчивается стандартные фичи языков, стандартные библиотеки и начинается платформо зависимая пропраятщина, что особенно заметно в С++.
так как опять-таки привязана к конкретной платформе (потрудитесь объяснить, почему это «идиотизм»?)

Ну даже если не принимать во внимание тот факт что существуют сторонние реализации COM рантайма под не-Windows платформы, человек должен совершенно ничего не понимать в COM, чтобы говорить, что технология как таковая привязана к конкретной платформе. Присмотритесь к эппловскому CoreFoundation или к мозиловскому nsISupports. Ничего не напоминает? Мне все еще необходимо объяcнять «почему это идиотизм»?

Видимо вы никогда не пытались объектно ориентированную архитектуру экспортировать в ком :)

Вы заблуждаетесь в двух вещах: в том, что считаете, что понимаете что такое «объектно-ориентированная архитектура» и в том, что считаете, догадываетесь что я пытался и чего не пытался делать. «Наследование» интерфейсов — неудачный термин (и деталь реализации в некоторых языках), интерфейсы РЕАЛИЗУЮТСЯ классами. Причем (сюрприз!!!), далеко не только в COM. Еще для меня загадка, с каких пор множественное наследование стало стандартной фичей ООП языков, и с каких пор COM перестал поддерживать реализацию множества интерфейсов (Вы же это имеете в виду?). Полиморфизм — э-э-э Вы точно понимаете, что такое полиморфизм? Что же до перегрузки — действительно перегрузка не поддерживается напрямую (потому что ABI остается одним и тем же и для языков, которые поддерживают перегрузку и для тех, которые не поддерживают — да-да, перегрузка — тоже не такая уж «стандартная фича ООП языков»), с другой стороны поддерживается аннотация [overload] для языков, которые перегрузку поддерживают и хотят спроецировать данный метод под перегруженным именем.

… Единственная претензия к Майкрософту, что они любят проталкивать свои собственные костыли под видом «стандарта»...

Каждый раз когда я вижу подобные утверждения мне хочется научиться бить людей по TCP/IP. Вы, похоже, сами не осознаете, но данным абзацем Вы ПОЛНОСТЬЮ подтвердили мое утверждение о том, что у Вас ABM (пусть даже и в начальной стадии).
Не вижу смысла продолжать дискуссию при ваших постоянных попытках перехода на личности, вы даже ничего не ответили по сути, кроме обвинений в том, что «я ничего не понимаю». Кстати, забавно, но все, что вы пишите, указывает на то, что вы сами являетесь ярым фанбоем, в чем почему то пытаетесь обвинить меня, хотя я я просто написал почему мне не нравится одна устаревшая кривоватая технология, а вовсе не «наезжал» на вашу любимую компанию.
Хм, я ничего не ответил? А ссылочки там для чего? По первому абзацу остались вопросы?

По множественному наследованию как стандартной фиче ООП языков. Возьмем два самых популярных ООП языка — Java и C#.
java.lang.Class содержит два аксессора:
public Class getSuperclass()
public Class[] getInterfaces()

Прошу отметить, что базовый класс всегда один, интерфейсов — несколько, и обе сущности отделены друг от друга.

System.Type содержит проперти
public abstract Type BaseType { get; }
и аксессор
public abstract Type[] GetInterfaces()

Прошу отметить, что имеем ОДИН базовый класс, несколько интерфейсов и то и другое является отдельными сущностями.

Возьмем еще один популярный OOP язык — JavaScript. Ой, там вообще классов нет, а вместо них прототипы.

Продолжать?

Реализация множества интерфейсов коклассами. Даже не знаю, зачем я должен это писать — это нужно или знать, или не рассуждать о том, чем COM является и чем не является.

Полиморфизм. QueryInterface это полиморфизм и есть. Концентрированный. Вы работаете с интерфейсом, а coclass-ы, реализующие этот интерфейс уже сами решают чего им делать.

«Проталкивание собственных костылей под видом стандартов»
Оставим в стороне Вашу личную оценку качества предлагаемых технических решений («костыль» или не «костыль» решать тем, кто хотя бы в принципе разбирается в том, что предлагается). Но ведь, как и предполагалось, Вы не понимаете, в чем Ваша ошибка. Хорошо, попробую подтолкнуть Вас к тому, чтоб Вы сами осознали. Критикуя — предлагай. Какая альтернатива: КТО не «проталкивает собственные костыли под видом стандартов» (из тех, кто делает хоть что-то)? И откуда вообще берутся эти самые «несобственный костыли»?

Ах да, Вы наезжали не на «мою любимую компанию» и даже не на мою любимую технологию — Вы просто необоснованно критиковали (и упорствуете, хотя уже сами же признали, что Вы даже и не пытались в ней толком разобраться) технологию. Мне не нравится, когда критика высказывается людьми, которые не понимают о чем говорят (вон взгляните там ниже amarao выступил — стоило оставить этот выпад неотвеченным просто для того, чтоб не быть уличенным в «любви к компании»?). В общем, я никого не хотел обидеть (и прошу прощения, если таки обидел), но стереотипы вокруг Microsoft уже настолько надоели, что начали раздражать.
ATL? COM? Закопайте обратно. :)
Опоздали с топиком лет эдак на 10-15. Ну а че, давайте писать гайды по кодингу для DOS например =)
Ну раз уж поперли довольно глупые штампы, давайте и я: «А Вы разве не знали, что Windows это всего лишь оболочка над DOS и есть, следовательно любое программирование под Windows это и есть программирование под DOS».
Вы опоздали с этим заявлением на 10 лет :)
ActiveX? Это технология, которая работает ТОЛЬКО на Windows, ТОЛЬКО в IE и ТОЛЬКО в 32-битах?

ActiveX? Это технология, которая позволяет запускать программы с сайтов без согласия пользователя и даёт этим программам 100% доступ к всем документам и настройкам пользователя, включая пароли, куки и прочие приватные вещи?

Да вы рехнулись, батенька.
Красноглазик, отаку, гик, нерд, фанат линукса, недоброжелатель майкрософта, оракла, и т.д.
Сейчас вы мне расскажите, какое благо есть быть ActiveX, и миллион сисадминов, которые настраивают всякие уродливые банк-клиенты с «IE6 only» это подтвердят, да?
Красноглазые иксперты такие искперты.
В первом же абзаце из трех утверждений — 2 фактических ошибки («ТОЛЬКО в IE и ТОЛЬКО в 32-битах») и одно утверждение верно с большими натяжками («ТОЛЬКО на Windows»). Во втором абзаце неверно вообще все.

Почему бы Вам не перестать позориться и выскакивать с заявлениями о Windows? И ведь это не первый раз, когда Вам демонстрируют, что Ваши знания о Windows… как бы это помягче сказать… далеко не исчерпывающи. Либо Вы в принципе неспособны воспринимать информацию и рефлексировать, либо Вы неспособны воспринимать информацию и рефлексировать только если дело касается Microsoft (а также Apple, Oracle и пр.).

Нет, я серьезно, либо уже перестаньте влазить в посты, посвященные Windows либо таки сделайте усилие и РАЗБЕРИТЕСЬ в вопросах, по которым у Вас уже есть Мнение. Спасибо-пожалуйста-у-меня-все.
Жду примера ActiveX под Debian/Hurd с ARM-архитектурой. В качестве браузера… Ну, допустим, opera.
Мдя, говорю ж — не лечится.

Давайте по порядку.
«ТОЛЬКО в IE» — читаем статью: «Встраивание в приложение на Windows.Forms».
«ТОЛЬКО в 32 битах» —
«ТОЛЬКО на Windows» — здесь, как я уже сказал, с некоторыми натяжками можно согласиться. Во первых этих Windows — было три штуки разных Windows NT, Windows 9x и Windows CE (Embedded Compact). На всех трех работал ActiveX — сам по себе он от платформы не зависит. А вот и пример вполне себе ActiveX под «Debian/Hurd с ARM». Вот еще один

Что же до Вашего второго абзаца, у меня есть встречное предложение. Вы создаете простенький ActiveX и даете мне ссылку. Я по ней кликаю, далее происходит следующее: Ваша «программа» запускается без моего согласия, Вы «получаете 100% доступ ко всем моим документам, настройкам, включая пароли куки и прочие приватные вещи», думаю похищения хабракуки и комментария от моего имени «pwned, Windows suxx» будет более чем достаточно, чтоб подвердить Вашу позицию (только, пожалуйста, без мошенничества вроде неизвестной XSS на хабре или типа того — нужно провести все исключительно через ActiveX, устанавливаемый без моего согласия).
Хм, вполне осознаю, что «встречное предложение» потребует неоправданно много усилий, так что давайте хотя бы так: Вы СЛОВАМИ обрисовываете план «атаки» и попутно рассказываете, почему дыра такой величины НИ РАЗУ в истории не использовалась злоумышленниками (они, лентяи, все больше на соц инженерию нажимают)?

И, пожалуйста, попробуйте не опозориться. В очередной раз.
А почему вы хидер с интерфейсами вручную делали? Удобнее будет взять хидеры, которые midl генерирует.
да ну просто чтобы читабельнее и понятнее вышло
Да, то что генерит midl лучше не читать :) Наверное, все же, стоит указать, что так в реальной жизни так обычно не делают. Еще одну штуку нашел:

>>> свойство m_bWindowOnly в TRUE — это будет означать, что наш компонент поддерживает встраивание исключительно в графические приложение.

Не совсем понятно, что вы имели в виду. Это свойство говорит о том, может ли контрол работать в windowless ркжиме, т.е. без выделенного для себя HWND: отрисовываться в контексте, который предоставляется контейнером и получать от него информацию о необходимых событиях.
касательно m_bWindowOnly — согласен, выразился как-то совсем кривовато. Имел ввиду именно что контролу нужно «свое окошко».
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории