Почему люди используют ATL для программирования COM? - PullRequest
6 голосов
/ 07 сентября 2010

Можете ли вы привести пример, который через сравнение показывает выгоду ATL ?

Ответы [ 2 ]

7 голосов
/ 07 сентября 2010

Похоже, вам нужны конкретные примеры того, как ATL упрощает программирование COM; вот что пришло мне в голову.

  • CComObjectRootEx: Получая классы COM из CComObjectRootEx, вы получаете поточно-ориентированный подсчет ссылок бесплатно.

  • CComCoClass: этот базовый класс реализует все методы создания экземпляров вашего класса, включая IClassFactory, необходимый для использования клиентом CoGetClassObject с вашим компонентом.

  • COM_INTERFACE_ENTRY макросы: ATL предлагает целую кучу макросов для использования между BEGIN_COM_MAP и END_COM_MAP, которые вы можете используйте для реализации кишок IUnknown::QueryInterface в соответствии с вашими требованиями, какими бы они ни были.

  • IDispatchImpl: если вы хотите, чтобы ваши компоненты были доступны для скрипта, вы должны реализовать IDispatch. ATL предоставляет класс IDispatchImpl, который избавляет от необходимости реализовывать его самостоятельно.

  • CComPtr / CComQIPtr: ATL предоставляет эти классы интеллектуальных указателей, которые инкапсулируют вызовы IUnknown::AddRef, IUnknown::Release и IUnknown::QueryInterface. Их использование сделает ваш код более легким для чтения и менее подверженным ошибкам подсчета ссылок COM.

  • CComBSTR / CComVariant: ATL предоставляет эти классы, которые снижают сложность работы с типами BSTR и VARIANT COM.

3 голосов
/ 07 сентября 2010

Разработчики ленивы и предпочитают простые вещи, а не сложные, и ATL был разработан для облегчения разработки COM.

В большинстве случаев ATL заботится о многих беспорядочных деталях разработки COM,например, управление QueryInterface, подсчет ссылок и управление временем жизни, а также все различные модели потоков, поддерживаемые COM.Он также предоставляет встроенную поддержку для таких вещей, как двойные интерфейсы, точки подключения, перечислители и т. Д.

Если вы не используете ATL или что-то подобное, вы будете писать намного больше кода.Это было бы прискорбно;)

Редактировать:

Я не собираюсь писать какой-либо COM-код без ATL для примера, потому что это так ужасно, но проверьте это:

http://www.codeproject.com/KB/COM/simplecomserver.aspx

Загрузите его, а затем просмотрите следующие файлы в проекте simplecomserver:

registry.cpp

simplecomserverImpl.cpp

(около 700 строк кода)

Теперь представьте, что вместо написания всего этого уродства вы можете извлечь класс из CCoComClass и просто реализовать метод Name, а затем сделать это для обработки экземпляров и регистрации класса:

// Used to determine whether the DLL can be unloaded by OLE
STDAPI DllCanUnloadNow(void)
{
    return _AtlModule.DllCanUnloadNow();
}


// Returns a class factory to create an object of the requested type
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}


// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
    // registers object, typelib and all interfaces in typelib
    HRESULT hr = _AtlModule.DllRegisterServer();
    return hr;
}


// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void)
{
    HRESULT hr = _AtlModule.DllUnregisterServer();
    return hr;
}
...