2009-11-16 4 views
4

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

Когда вы выполняете управление activeX, делаете двойные интерфейсы (как описано в ACDual от microsoft) good/bad/не имеет никакого значения?

ответ

1

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

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

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

1

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

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

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

+0

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

1

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