MFC COM или ATL COM (ActiveX)

У меня есть код MFC (настраиваемые элементы управления CWnd и некоторые классы для раскрытия), который мне нужно превратить в объект activex / COM с интерфейсами. Проще ли создать проект ATL с поддержкой MFC и сделать мой ActiveX таким же или создать элемент управления MFC ActiveX?

При выполнении элемента управления ActiveX делает ли двойной интерфейс (как описано в ACDual от Microsoft) хорошо / плохо / не имеет значения?


person BabelFish    schedule 16.11.2009    source источник


Ответы (3)


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

Кроме того, IIRC MFC не поддерживает двойные интерфейсы. Двойные интерфейсы интересны в двух случаях: - Производительность - это проблема. Например, вызов короткого метода, выполняемый миллионы раз. - Пользователи объекта запрограммированы на C ++. Вызов собственного интерфейса в C ++ намного проще, чем вызов интерфейса автоматизации.

В заключение, двойные интерфейсы - это круто, но они действительно интересны, только если вы можете получить их бесплатно. Это означает, что вы используете фреймворк, который их поддерживает. Если вы планируете много работы на основе COM, интересно изучить ATL и более глубокие познания в области COM. Если вам просто нужно предоставить пару простых объектов на основе MFC, просто придерживайтесь MFC.

person Serge Wautier    schedule 16.11.2009

Немного болезненно использовать MFC для COM - слишком много кода для написания, макросов для копирования - однако вы должны знать, что делаете, если смешиваете MFC и ATL, потому что они обманчиво похожи, но разные, особенно если вы создаете окна с помощью ATL.

Главное, если вы используете MFC из ATL, вам нужно будет запускать каждый из ваших методов ATL с AFX_MANAGE_STATE (AfxGetStaticModuleState ()), иначе вы получите случайные проблемы. Это делается автоматически, когда вы реализуете COM с помощью MFC, поэтому в каждом методе есть эти уродливые макросы METHOD_MANAGE_STATE.

Помимо этого, это просто работает. Объекты MFC внутри объектов ATL - это то, чем я занимаюсь ..

person fredr    schedule 17.11.2009
comment
Если я добавлю поддержку ATL к моему проекту mfc, а затем добавлю объект ActiveX ATL ... как я могу обернуть свой собственный cwnd в этот Atl ActiveX ?? CWnd :: create требуется родительский CWnd * .. в MFC родительский элемент будет COleControl (который является CWnd) .. ActiveX ATL является производным от CWindow .. - person BabelFish; 17.11.2009

Я всегда использовал прямой ATL без MFC для разработки компонентов COM. MFC полезен как каркас приложения, который мне обычно не нужен для легких (не связанных с пользовательским интерфейсом) компонентов COM. ATL обеспечивает широкую поддержку строк, коллекций и различных служебных классов без необходимости вводить все MFC с логистическими сложностями, которые возникают в результате этого (например, установка контекста для каждого вызова общедоступного API и т. Д.). Он также включает некоторую базовую поддержку пользовательского интерфейса через CWindow и его друзей, если вы создаете компонент пользовательского интерфейса.

person Rob Pelletier    schedule 17.11.2009