Fact-checked by Grok 2 weeks ago

Active Template Library

The Active Template Library (ATL) is a set of template-based developed by to simplify the programming of small, fast Component Object Model (COM) objects, including support for features like dual interfaces, connection points, and ActiveX controls. It enables developers to implement core COM interfaces such as IUnknown, IDispatch, and IClassFactory with minimal boilerplate code, emphasizing performance optimization and reduced binary size through extensive use of C++ templates. ATL was introduced with Visual C++ 5.0 in 1997 as part of Microsoft's efforts to streamline development during the rise of technologies for Windows applications. Over time, it evolved through multiple versions integrated into , with ATL 7.0 adding module classes for easier project setup and later releases incorporating support for .NET attributes to bridge and managed code. Since 2012, ATL has been provided as a library, eliminating the need for dynamic linking and further reducing deployment overhead. Key components of ATL include utility classes like CComBSTR for string handling, thread pool management via CThreadPool, and support for various threading models such as single-threaded apartments or free-threaded objects. It is particularly noted for its role in creating efficient servers and clients, and it forms the foundation for extensions like the Windows Template Library (WTL) for native Windows UI development. Despite the shift toward modern frameworks like .NET and WinRT, ATL remains relevant for legacy COM integration and low-level Windows programming in as of 2025.

Overview

Definition and Purpose

The Active Template Library (ATL) is a set of template-based developed by to facilitate the creation of small, fast (COM) objects, including OLE Automation servers and controls. ATL's primary purpose is to serve as a lightweight alternative to the Microsoft Foundation Class (MFC) library for COM programming, minimizing generation through the use of C++ templates that automate much of the repetitive implementation required for COM interfaces and object lifecycle management. By leveraging , ATL enables developers to produce efficient components with reduced code size and execution overhead compared to more comprehensive frameworks like MFC. Introduced in 1997 as part of Visual C++ 5.0 within the broader Windows development ecosystem, ATL was designed to address the need for streamlined development tools that integrate seamlessly with 's object-oriented programming model. At its core, aims to enable efficient, low-overhead component development by avoiding unnecessary dependencies, allowing compiled objects to operate with minimal external requirements and supporting usage in modern implementations. This focus on performance and simplicity makes particularly suitable for building deployable, resource-constrained -based applications.

Key Features and Benefits

The Active Template Library (ATL) employs C++ templates to facilitate compile-time , enabling the creation of lightweight (COM) components with minimal runtime overhead. This approach allows developers to implement standard COM interfaces, such as IUnknown and IDispatch, through parameterized classes that expand only the necessary code during compilation, avoiding the bloat associated with runtime polymorphism in traditional libraries. As a result, ATL-generated objects exhibit reduced execution times and smaller binary footprints compared to equivalent implementations using raw COM or the Foundation Classes (MFC). A core strength of ATL lies in its RAII-based support classes, including smart pointers like CComPtr and CComQIPtr, which automatically manage COM interface references via , and wrappers such as CComBSTR for BSTR strings and CComVariant for types. These utilities ensure deterministic resource cleanup, mitigating common issues like memory leaks and simplifying error handling in COM development. By encapsulating low-level details, they promote safer, more maintainable code without sacrificing performance. ATL further optimizes interface implementations through the (CRTP), particularly in base classes like CComObjectRootEx, which allows derived classes to provide static implementations of methods such as QueryInterface and AddRef for IUnknown, bypassing virtual function calls where feasible. This technique enhances and efficiency, contributing to ATL's reputation for producing compact, high-performance COM objects—often with DLL or EXE sizes under 10 KB for basic components. Overall, these features streamline development, reduce deployment complexities, and offer superior maintainability over manual COM coding or heavier frameworks like MFC. Unlike earlier versions that could rely on dynamic linking to ATL DLLs, starting with Visual Studio 2012, ATL is provided as a header-only library, allowing full static inclusion without runtime DLL dependencies and enabling self-contained executables for easier distribution. This flexibility, combined with ATL's template-driven minimalism, makes it ideal for resource-constrained environments while preserving COM interoperability.

History

Origins and Introduction

The Active Template Library (ATL) was developed by in the mid-1990s as a lightweight framework to simplify (COM) programming in C++, addressing the verbosity and overhead associated with using the () for such tasks. , while effective for general Windows application development, imposed a heavy that bloated COM components, prompting the need for a more efficient alternative focused on minimal runtime dependencies and code size. ATL's design drew on the growing adoption of C++ templates during this era, enabling reusable, type-safe code without the inheritance-based bloat of traditional libraries. ATL was formally introduced in February 1997 as part of Visual C++ 5.0 Professional Edition, aligning with Microsoft's push for component-based software in the and ecosystems. This release emphasized native support to foster reusable components suitable for Internet and client/server applications, complementing MFC by providing a leaner option for developers targeting performance-critical scenarios. The library's motivations centered on creating small, fast objects with reduced overhead, such as optional dynamic linking to avoid unnecessary startup code, making it ideal for in-process servers like DLLs. Early adoption of occurred primarily in enterprise Windows applications, where it facilitated the development of controls and servers for embedding reusable components across diverse environments. Tools like the ATL Object Wizard and ATL Applications Wizard, included from the outset, accelerated this uptake by streamlining the creation of COM-compliant objects.

Version Evolution

The evolution of the Active Template Library (ATL) has closely paralleled the releases of , with incremental updates focusing on compatibility, , and integration enhancements rather than radical redesigns. Versions of ATL prior to 7.1, which corresponded to releases before .NET 2003, exhibited incompatibility with Data Execution Prevention (DEP), a hardware-enforced feature introduced in Service Pack 2; this stemmed from ATL's reliance on executable thunks for managing window callbacks, which could trigger DEP violations by attempting code execution on non-executable memory pages. ATL 7, introduced with Visual Studio .NET 2002, incorporated key MFC-like classes such as CString directly into the ATL framework to streamline development in mixed ATL-MFC environments and introduced C++ attributes as a declarative syntax for simplifying interface and class implementations. In 8, included in 2005, deemphasized the use of C++ attributes in favor of traditional template-based approaches due to complexities in attribute processing and maintenance; this shift promoted more direct control over generated code while incorporating security improvements, such as enhanced protections aligned with the /GS flag. On July 28, 2009, released a critical security update (MS09-035) addressing remote code execution vulnerabilities in headers used for controls; the patch fixed issues in connection point and event sink handling that could be exploited via malicious websites in hosts like . ATL 12, released with 2013, transitioned to a fully static model by eliminating the need for the atl.dll runtime; all functionality was consolidated into header files and a static (atl.lib), reducing deployment dependencies and deprecated several legacy features like certain mechanisms. Following 2013, ATL received ongoing maintenance through 2015 to 2022, including bug fixes, enhanced compatibility with , , and standards (such as lambda support and auto keyword integration), and minor optimizations; as of 2025, no major new features have been added, but full support persists in 2022 version 17.x for development on modern Windows platforms. Developers can query the ATL version at runtime using the AtlGetVersion() function, which returns a DWORD encoding the major and minor version numbers for conditional compilation or feature detection.

Architecture

Template-Based Design

The Active Template Library (ATL) employs C++ templates as its foundational mechanism to generate type-safe, customized code at compile-time, enabling developers to implement COM interfaces with minimal runtime overhead and ensuring compliance with COM standards without manual boilerplate. This approach allows for the automatic derivation of interface-specific wrappers and stubs, tailoring the generated code to the exact interfaces declared in the project's interface definition language (IDL) files, which promotes both efficiency and reduced error-proneness in COM object creation. A key aspect of ATL's template-based design is the deliberate avoidance of virtual functions in base classes, which eliminates the need for extensive vtable entries and associated indirection overhead typically incurred in traditional implementations using . Instead, templates facilitate inline implementations of methods, where the expands the code directly into the derived class, resulting in flat, non-virtual call sites that optimize for speed and size in both in-process and out-of-process scenarios. Central to this architecture is the module system, exemplified by the CComModule class in earlier versions and its successor CAtlModule, which manages DLL and EXE lifecycles, including object registration, unregistration, and the creation of class factories for instantiating COM objects. These template-derived module classes encapsulate the hosting environment, handling initialization, threading models, and resource cleanup, thereby abstracting the complexities of COM server deployment while integrating seamlessly with the Windows registry for self-registration. ATL's design separates the implementation of COM interfaces from the underlying object hosting, with templates automatically managing core IUnknown methods such as QueryInterface, AddRef, and through aggregated or non-aggregated base classes like CComObject. This decoupling ensures that interface logic remains focused on business functionality, while the template machinery delegates reference counting and interface querying to optimized, generated code, preventing common pitfalls like circular references or incorrect aggregation. Through compile-time polymorphism enabled by templates, ATL achieves zero-cost abstractions, where the compiler resolves interface dispatches and type conversions at build time, producing executable code indistinguishable from hand-written, low-level implementations in terms of performance. This technique, akin to the (CRTP), allows for static polymorphism without runtime dispatch costs, making ATL particularly suitable for resource-constrained environments like embedded systems or high-performance servers.

Employed Design Patterns

The Active Template Library (ATL) employs the (CRTP) extensively to implement non-virtual interfaces for objects, enabling static polymorphism and avoiding the overhead of calls. In this pattern, a base class template is instantiated with the derived class itself as a parameter, allowing the base to access members of the derived class without runtime dispatch. The CComObject template is defined as template &lt;class Base&gt; class CComObject : public Base. Instances of a user-defined class (Base) are created using CComObject<Base>::CreateInstance, employing CRTP so that CComObject<Base> inherits from Base, allowing the base to implement IUnknown methods using the derived class's members without virtual overhead. This usage in bases like CComObjectRootEx facilitates efficient IUnknown implementation by permitting the derived class to "inherit" from itself via the template parameter, ensuring compile-time resolution of methods like QueryInterface, AddRef, and . ATL also leverages policy-based design through customizable template parameters that allow developers to tailor behavior without altering core code. Templates such as CComObjectRootEx are parameterized by a ThreadModel policy (e.g., CComSingleThreadModel or CComMultiThreadModel), which dictates synchronization strategies for and aggregation support. This approach enables flexible configuration of object policies, such as handling aggregation or tearing off interfaces, by substituting policy classes at , promoting and minimal boilerplate. Resource Acquisition Is Initialization (RAII) is integral to ATL's COM management, with smart pointer classes like CComPtr and CComQIPtr automating lifetime handling for interface pointers and variants. These wrappers ensure deterministic cleanup of COM resources upon scope exit, preventing leaks in exception-prone code by encapsulating AddRef and Release calls. This pattern aligns with COM's reference-counting model, providing automatic tear-off support and reducing errors. The factory pattern manifests implicitly in ATL via classes like CComClassFactory, which handles instance creation without requiring explicit user code for COM registration or . This template-based factory integrates with the module system (e.g., CAtlDllModuleT) to produce objects compliant with COM standards, supporting both in-process and out-of-process servers through standardized IClassFactory implementation.

Core Components

Support Classes

The Active Template Library (ATL) provides a suite of support classes designed to simplify and handle COM-specific data types in C++ applications, ensuring safe and efficient interaction with the (COM) environment. These classes adhere to the (RAII) idiom, automatically managing memory allocation and deallocation to prevent leaks, particularly in exception-prone code. By encapsulating low-level COM operations, they reduce and enhance reliability for developers creating COM components. CComPtr is a template-based that manages pointers to COM interfaces derived from IUnknown. It automatically calls AddRef upon acquiring a non-null interface pointer and Release upon destruction or reassignment, thereby handling without manual intervention. Constructors include a default empty initialization, direct assignment from a raw pointer (which triggers AddRef), and copy construction from another CComPtr instance. Key operators such as = and -> facilitate intuitive usage, while methods like QueryInterface support querying. This is essential for maintaining and preventing dangling pointers in programming. CComBSTR serves as a wrapper for BSTR (Basic String Type) strings, which are length-prefixed, null-terminated Unicode strings commonly used in COM for automation. It employs SysAllocString for allocation and SysFreeString for deallocation, with RAII ensuring automatic cleanup in the destructor even if exceptions occur. Constructors support initialization from various sources, including C-style strings, GUIDs, and other BSTRs, while methods like Append, Copy, and Length provide string manipulation. Operators enable direct comparison, assignment, and concatenation, making it a robust alternative to raw BSTR handling. CComVariant encapsulates the VARIANT type, a union-like structure in that can hold diverse data such as integers, strings, arrays, or pointers, indicated by its vt member for type identification. It inherits from tagVARIANT and supports type coercion via the ChangeType method, which converts the variant to a specified VARTYPE using underlying functions like VariantChangeType. is automated through Clear (invoking VariantClear) in the destructor, along with Attach and Detach for transferring . This RAII-based approach handles resources for complex types like BSTRs and SAFEARRAYs, simplifying VARIANT usage in scenarios. CComSafeArray is a template class (templated on element type T and VARTYPE _vartype) that wraps the SAFEARRAY structure for creating and managing multidimensional arrays compatible with COM automation. It provides bounds-checked access through methods like GetAt and SetAt for single dimensions, or MultiDimGetAt and MultiDimSetAt for multiple dimensions, preventing out-of-bounds errors. Creation occurs via Create with specified bounds, resizing with Resize, and cleanup via Destroy in the destructor for RAII compliance. Supported types include integers (VT_I4), floats (VT_R8), and variants (VT_VARIANT), facilitating safe inter-process data transfer. Additional utility classes extend this support for general resource handling. CComHeapPtr manages memory allocated on the COM heap using CoTaskMemAlloc and CoTaskMemFree through the CComAllocator, with RAII ensuring automatic release upon scope exit; it derives from CHeapPtr and supports direct pointer attachment in constructors. CAtlArray offers a dynamic array template for user-defined types, automatically resizing via Add and SetCount while applying RAII to free elements in the destructor; it uses traits like CElementTraits for custom copy/move semantics. Together, these classes form a foundational layer for robust COM development in ATL.

COM-Specific Templates

The Active Template Library (ATL) provides several specialized templates and macros tailored for implementing (COM) interfaces and objects, enabling efficient support for IUnknown delegation, interface querying, and advanced features like aggregation and . These components leverage the (CRTP) to minimize overhead while ensuring compliance with COM standards. CComObject serves as the foundational template for creating simple, non-aggregated COM objects, deriving from the user's class via CRTP to implement the IUnknown interface. It delegates QueryInterface, AddRef, and Release calls to a base class like CComObjectRootEx, allowing the object to manage its own lifetime without external aggregation. This template is particularly suited for standalone COM components where the outer unknown is the object itself. CComCoClass is a template class that facilitates the declaration of COM classes supporting multiple interfaces, incorporating macros such as DECLARE_CLASSFACTORY and DECLARE_AGGREGATABLE to define the default class factory and aggregation behavior. It provides essential methods for retrieving the object's CLSID, setting error information through IErrorInfo, and instantiating the class via the class factory, streamlining registration and creation processes in the COM module. For Automation-enabled COM servers, IDispatchImpl offers a default implementation of the IDispatch interface portion of dual interfaces, which derive from both IDispatch and IUnknown. This template handles type information loading from a type library and dispatches calls based on member IDs, reducing for objects that need to support late binding in scripting environments like . IConnectionPointContainerImpl implements the IConnectionPointContainer interface to manage a collection of connection points, primarily for controls that support event sinks. It maintains a list of IConnectionPointImpl objects, enabling clients to advise on events by establishing connections, which is crucial for bidirectional communication in controls. ATL supports COM aggregation through CComAggObject, a template that implements IUnknown for nested, aggregated objects by forwarding calls to an outer IUnknown provided during construction. This ensures proper delegation in scenarios where one COM object contains another, maintaining the aggregated object's identity while adhering to COM aggregation rules. Interface maps in ATL are defined using macros like BEGIN_COM_MAP and END_COM_MAP, which delimit a table of COM_INTERFACE_ENTRY entries to route QueryInterface requests to the appropriate implementations. These maps integrate seamlessly with the IUnknown in classes like CComObject, allowing efficient resolution of supported interfaces without overhead.

Development Integration

Compiler and Language Support

The Microsoft Visual C++ compiler provides built-in COM support through a set of classes defined in the <comdef.h> header, designed to simplify handling of COM data types and interfaces without relying on ATL templates. These include _com_ptr_t, a template class that acts as a smart pointer for COM interfaces, automatically managing AddRef, Release, and QueryInterface calls to prevent memory leaks. Similarly, _bstr_t wraps the BSTR type, offering operators for assignment, comparison, and conversion while handling allocation and deallocation via SysAllocString and SysFreeString. The _variant_t class encapsulates VARIANT structures, supporting type-safe operations like coercion and dispatch calls, and _com_error represents HRESULT-based exceptions, enabling structured error handling in COM operations. Unlike these wrappers, the compiler's COM support does not include a dedicated SAFEARRAY wrapper; developers are instead recommended to use ATL's CComSafeArray template for safe management of multidimensional SAFEARRAYs in COM automation. The #import directive further enhances integration by processing type libraries (.tlb files, often generated by MIDL from IDL definitions) at , automatically generating C++ wrapper classes, including smart pointers like _com_ptr_t instances for each interface, to facilitate late binding and reduce boilerplate code for MIDL-defined interfaces. Microsoft's C++ attributes for , such as coclass for declaring COM classes and __declspec(uuid) extensions for embedding GUIDs, were introduced to enable attribute-based declaration of COM objects but have been deprecated since ATL version 9 (post-ATL 8, corresponding to 2008 and later), with support phased out to encourage template-based approaches; using them now triggers compiler warnings like C4467. ATL maintains full compatibility with and later standards in modern versions (up to VS 2022 and beyond), allowing seamless integration with features like , lambdas, and move semantics, though certain templates (such as those using dynamic_cast for queries) require the /GR flag for (RTTI), and in ATL modules often necessitates /EHa for asynchronous structured exceptions to ensure robust error propagation. These compiler options can be set project-wide, and ATL's core functionality remains optimized for standard-compliant C++ without conflicts. For instance, ATL smart pointers like CComPtr (from ATL's support classes) complement the compiler's _com_ptr_t by providing additional policy-based customization.

Tools and Wizards

The Project Wizard in enables developers to create a new configured for development, generating essential including the inclusion of atlcom.h for core functionality and support for either DLL or application types with built-in registration mechanisms. This wizard streamlines the initial setup by configuring for , such as enabling merge /stub modules and setting the character set, while allowing options to merge with if needed. Once an ATL project is established, the Add Class Wizard facilitates the addition of specific COM components by providing templates for various object types, including ATL Simple Object for basic in-process servers, ATL Control for controls, and support for dual interfaces that combine IDispatch and custom methods. Selecting these options automatically generates corresponding C++ class files, interface definition language (.idl) files for type descriptions, and implementation maps to link classes with their COM entries, reducing manual configuration errors. For dual interfaces, the wizard ensures compatibility with automation clients by deriving from IDispatch while preserving custom interface efficiency. The Registrar component provides built-in self-registration capabilities through methods like CAtlModule::UpdateRegistryFromResourceD, which dynamically links to the ATL registry DLL (atl.dll) to handle entries such as CLSIDs, ProgIDs, and type libraries during installation or DLL loading. This uses resource-based scripts with replaceable parameters to register objects without external tools, supporting both registration and unregistration via command-line flags like /regserver and /unregserver. As part of module initialization, it integrates with CAtlModule to update the securely, often in conjunction with template-based module designs for object factories. MIDL integration in automates the compilation of .idl files into type libraries (.tlb) and proxy/stub code during the build process, particularly essential for dual interfaces that require marshaling support for cross-process communication. Project properties under the MIDL Compiler category allow customization of options like generating UUIDs, error checking, and output paths, ensuring seamless generation of header files and libraries for classes implementing dual interfaces. Visual Studio 2017 and later include native CMake integration, allowing ATL projects to be configured and built using files within the IDE for cross-platform compatibility and automated dependency resolution. Additionally, serves as a dependency manager that includes an 'atl' port to verify and install ATL components, facilitating easier integration of ATL with other libraries in CMake-based workflows.

Usage and Applications

Implementing COM Objects

The Active Template Library (ATL) simplifies the creation of (COM) objects by providing template-based classes that handle much of the for interface implementation, , and aggregation support. To implement a basic COM object, developers derive their class from core ATL templates such as CComObjectRootEx and implement the desired interfaces using the COM map macros. This approach ensures compliance with COM standards while minimizing code size and overhead. The step-by-step process begins with defining the COM class by deriving it from CComObjectRootEx, parameterized with a threading model like CComSingleThreadModel for single-threaded apartments, and from the interfaces it supports. This base class provides the foundational IUnknown implementation through IUnknownImpl, managing reference counting via AddRef, Release, and QueryInterface methods. Next, include the BEGIN_COM_MAP and END_COM_MAP macros in the class definition to declare the supported interfaces, using COM_INTERFACE_ENTRY to map each interface's IID to its implementation. For non-aggregated objects, derive from CComObject as well, which wraps the base functionality for standard COM creation. Additionally, use macros like DECLARE_REGISTRY_RESOURCEID to associate the class with a registry script for self-registration and DECLARE_PROTECT_FINAL_CONSTRUCT to enable final construct protection against reentrancy. A representative example class structure for a simple COM object implementing an interface IMyInterface (defined in a header with pure virtual methods) is as follows:
cpp
#include <atlbase.h>
#include <atlcom.h>

interface IMyInterface : public IUnknown {
    virtual HRESULT STDMETHODCALLTYPE MyMethod() = 0;
};

class ATL_NO_VTABLE CMyObject :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CMyObject, &CLSID_MyObject>,
    public IMyInterface {
public:
    DECLARE_REGISTRY_RESOURCEID(IDR_MyObject)
    DECLARE_PROTECT_FINAL_CONSTRUCT()

    BEGIN_COM_MAP(CMyObject)
        COM_INTERFACE_ENTRY(IMyInterface)
    END_COM_MAP()

    STDMETHOD(MyMethod)() override {
        // Implementation details here
        return S_OK;
    }
};
This structure uses CComCoClass to define the class factory and CLSID, ensuring the object can be instantiated via COM. To implement the methods, override the pure functions from the declaration within the body, returning appropriate HRESULT values to indicate success (S_OK) or errors (e.g., E_FAIL). For querying , ATL's QueryInterface leverages the map to cast pointers using smart pointers like CComQIPtr<IMyInterface>, which automates the QueryInterface call and reference management. Error handling in methods should propagate failures via HRESULT returns, allowing clients to check results with macros like FAILED(hr). For in-process servers (DLLs), registration is handled by implementing the DllRegisterServer , which calls the module's RegisterServer (typically from CAtlDllModuleT) to add CLSID, ProgID, and type library entries to the . This is invoked via tools like regsvr32.exe or during , with DllUnregisterServer for cleanup. The , such as _AtlModule, manages the object map linking CLSIDs to class factories. Testing the COM object involves using CoCreateInstance to instantiate it by CLSID, specifying the server context (e.g., CLSCTX_INPROC_SERVER for DLLs) and desired interface IID. A basic test might look like this:
cpp
#include <comdef.h>
#include <atlbase.h>

HRESULT hr = CoCreateInstance([CLSID_MyObject](/page/Com), NULL, CLSCTX_INPROC_SERVER,
                              IID_IMyInterface, (void**)&pInterface);
if (SUCCEEDED(hr)) {
    pInterface->MyMethod();
    pInterface->Release();  // Or use CComPtr for auto-release
    CoUninitialize();
}
This verifies creation, method invocation, and error handling, with HRESULT checks ensuring robustness. ATL's smart pointers like CComPtr simplify testing by managing lifetimes automatically.

Creating ActiveX Controls

The Active Template Library () provides specialized templates and classes for developing embeddable controls, which are lightweight COM components designed for integration into containers such as legacy web browsers (e.g., ), applications, or other hosting environments that support ActiveX. These controls support user interfaces, properties, events, and persistence, enabling visual interactivity while minimizing overhead through ATL's template-based approach. Developers typically start by using the ATL Control Wizard in to generate a skeleton project, which produces an OCX file containing the control. For windowed ActiveX controls, the primary base class is CComControl<T>, where T is the control's , which inherits from CComControlBase and handles core interfaces like IOleObject, IPersistStorage, and IViewObject. This class manages window creation, message routing, and rendering, allowing the control to behave as a standard Windows window within a . For controls based on dialog resources that host other sub-controls, CAxDialogImpl<T> serves as an alternative base class, providing hosting capabilities for embedded or Windows controls while supporting modal or modeless operation. Persistence is implemented via IPersistStreamInit, which enables the control to save and load its state from streams, ensuring compatibility with serialization requirements. Events are fired using IConnectionPointImpl, which manages outgoing interfaces defined in the control's type library (IDL file), allowing containers to connect sinks for notifications such as mouse clicks or state changes. For instance, in a polygon-drawing , events like ClickIn and ClickOut can be declared in the IDL, with firing methods generated automatically (e.g., Fire_ClickIn(x, y)), invoked via IDispatch::Invoke on connected sinks. Design-time properties are exposed through IPropertyPageImpl, integrated via the ISpecifyPropertyPages interface; the ATL Control Wizard generates property maps with PROP_PAGE entries to link custom or stock pages (e.g., for color or font selection), which appear in container tools like or the Test Container. Drawing occurs in the OnDraw method, overridden in the derived , which receives an DRAWINFO structure containing an HDC for rendering to the 's client area. Controls query ambient properties from the —such as back color (AMBIENT_BACKCOLOR) or font—using IOleControl::GetAmbientProperty to adapt dynamically; for example, a control might translate the ambient back color via OleTranslateColor to set a brush for filling shapes. ATL includes stock implementations for common properties like fonts, accessible through IProvideClassInfo2. A representative example involves deriving a CPolygonControl from CComControl<CPolygonControl>, implementing IOleObject via the COM map, and overriding OnDraw to render a :
cpp
HRESULT CPolygonControl::OnDraw(ATL_DRAWINFO& di)
{
    HDC hdc = di.hdcDraw;
    RECT& rc = *(RECT*)di.prcBounds;
    // Query ambient backcolor
    OLE_COLOR clrBack;
    GetAmbientProperty(DISPID_AMBIENT_BACKCOLOR, VT_I4, &clrBack);
    COLORREF crBack = OleTranslateColor(clrBack, NULL, 0);
    // Fill background
    HBRUSH hBrush = CreateSolidBrush(crBack);
    FillRect(hdc, &rc, hBrush);
    DeleteObject(hBrush);
    // Draw polygon using m_nSides property
    POINT points[5]; // Example for pentagon
    CalcPoints(rc, points, m_nSides);
    Polygon(hdc, points, m_nSides);
    return S_OK;
}
This approach ensures efficient, container-aware rendering without redundant code. Deployment involves building the project as a (DLL) or OCX file, followed by registration using regsvr32.exe (e.g., regsvr32 PolygonCtl.ocx) to enter the control's CLSID, ProgID, and type into the registry, enabling discovery by containers. For web integration, the control is embedded via <OBJECT> tags in , compatible with through safe-for-scripting declarations using IObjectSafetyImpl to mitigate security prompts. ATL controls also integrate seamlessly with hosts, such as embedding in Word or Excel documents, provided the OCX is registered and is enabled in the container's settings (note: disabled by default in Office 2024 and as of October 2024).

Current Status and Limitations

Recent Updates

Since the release of 2015, the library has benefited from enhanced support through updates to the underlying compiler and standard library, enabling better conformance to modern language features for development. These improvements allow ATL templates to leverage constructs like generic lambdas and variable templates, facilitating more efficient and expressive code for controls and objects. In 2019 and 2022, ATL has improved compatibility with and standards, including fixes for the /std:c++latest mode to ensure better integration with the latest language extensions. Additionally, ATL's headers can now be managed via , Microsoft's C++ , providing hints for cross-platform builds while maintaining its Windows-centric focus on . Updates in 2022 version 17.x have emphasized stability enhancements, such as bug fixes in 's CString class for comparisons under modes, alongside general AI-assisted features in IntelliCode that extend to template usage. As of November 2025, 2022 version 17.12 (LTSC channel, released November 2024) includes further C++ conformance improvements applicable to . No major new core features have been added to itself, but has confirmed ongoing support through the full 10-year lifecycle of 2022, extending to January 2032. ATL remains distributed statically only, with all necessary headers and libraries bundled in the Visual Studio installer under the "C++ MFC and ATL" workload, eliminating the need for separate runtime redistributables in most scenarios.

Known Issues and Alternatives

Despite ongoing maintenance, older versions of the Active Template Library (ATL) exhibit compatibility issues with Data Execution Prevention (DEP), a security feature in Windows that prevents code execution from data pages, particularly affecting ATL's thunk emulation mechanism used for interface marshaling. This incompatibility can cause application crashes or failures when DEP is enforced in "Always On" mode, requiring developers to rebuild affected binaries with updated ATL libraries to mitigate the problem. ATL's attribute-based programming model, which simplifies COM object declaration through compiler attributes, has been deprecated since Visual Studio 2008, with full deprecation in Visual Studio 2015, leading to compiler warnings and errors in modern toolchains. Developers must now expand these attributes to explicit code or disable warnings, resulting in more verbose implementations that increase maintenance overhead without the conciseness of the original syntax. As a Windows-specific library tightly integrated with the (COM), ATL lacks native cross-platform support, confining its use to Windows environments and necessitating replacements like standard C++ types or third-party libraries for non-Windows development. Security concerns with ATL primarily stem from its role in creating ActiveX controls, which have been prone to vulnerabilities enabling remote code execution, as evidenced by multiple 2009 Microsoft security bulletins addressing flaws in ATL-compiled ActiveX components for Office and other applications. To mitigate risks in ActiveX controls built with ATL, developers are advised to adhere to the principle of least privilege, limiting control capabilities to essential functions and avoiding unnecessary system access. ATL's heavy reliance on C++ templates for lightweight COM objects can lead to code bloat in large projects, where excessive class proliferation from template instantiations increases binary size and compilation times, requiring careful control over template usage to avoid significant overhead. Modern alternatives to ATL include C++/WinRT, a header-only library for authoring Windows Runtime (WinRT) components in Universal Windows Platform (UWP) applications, offering a more contemporary, projection-based approach to COM-like interfaces without ATL's legacy baggage. For lighter COM interactions, the Windows Runtime C++ Template Library (WRL) provides template-based smart pointers and factories similar to ATL but optimized for WinRT, supporting and later. In scenarios involving .NET integration, COM interop allows .NET assemblies to expose or consume COM objects more simply than raw ATL, leveraging runtime marshalling for cross-language compatibility. For basic COM without templates, modern C++ practices using raw interfaces with careful or third-party smart pointers like those in the Windows Implementation Library (WIL) reduce boilerplate while avoiding ATL's complexity. ATL should be avoided in new projects that prioritize cross-platform compatibility or modern web architectures, such as those using over for , as 's binary standards limit portability and integration with non-Windows ecosystems. Migration paths often involve refactoring to COM-less designs, such as direct WinRT APIs or .NET Core for server-side components, to eliminate dependency on Windows-specific technologies.

References

  1. [1]
    Introduction to ATL | Microsoft Learn
    Jun 24, 2025 · ATL is the Active Template Library, a set of template-based C++ classes with which you can easily create small, fast Component Object Model ...
  2. [2]
    Active Template Library (ATL) Concepts - Microsoft Learn
    Jun 24, 2025 · The Active Template Library (ATL) is a set of template-based C++ classes that let you create small, fast Component Object Model (COM) ...
  3. [3]
    Active Template Library (ATL) - Intergraph Smart 3D - Help
    Set of class templates and wizards supplied with Microsoft C++ Version 5.0 and later. You can use an ATL when you create ActiveX controls and any other type ...
  4. [4]
    Redistributing an ATL application - Microsoft Learn
    Jun 30, 2025 · Starting in Visual Studio 2012, Active Template Library (ATL) is a header-only library. ATL projects do not have a Dynamic Link to ATL option.
  5. [5]
    Windows with C++: Windows Template Library 8.0 | Microsoft Learn
    Oct 1, 2019 · The Visual C++ team developed the Active Template Library (ATL) to allow COM clients and servers to be easily created while producing the ...
  6. [6]
    ATL COM Desktop Components | Microsoft Learn
    Aug 3, 2021 · The ATL Reference documents the Active Template Library (ATL), a set of template-based C++ classes that simplify the programming of Component Object Model (COM ...Missing: history | Show results with:history
  7. [7]
    ATL Project Wizard | Microsoft Learn
    Aug 3, 2021 · The Active Template Library (ATL) is a set of template-based C++ classes that simplify writing small and fast COM objects. The ATL Project ...
  8. [8]
    Recommendations for Choosing Between ATL and MFC
    Aug 3, 2021 · ATL is a fast, easy way to both create a COM component in C++ and maintain a small footprint. Use ATL to create a control if you don't need all of the built-in ...Missing: Template | Show results with:Template
  9. [9]
    Microsoft Announces Visual C++ 5.0, Professional Edition - Source
    Feb 11, 1997 · In addition to Microsoft Foundation Classes (MFC), a library standard for C++ programmers, Visual C++ 5.0 includes the new Active Template ...
  10. [10]
    CComPtr Class
    ### Summary of `CComPtr` Class
  11. [11]
    CComBSTR Class
    ### Summary of `CComBSTR` Class in ATL
  12. [12]
    The Curiously Recurring Template Pattern in C++
    May 17, 2011 · The Curiously Recurring Template Pattern in C++. May ... And finally, Microsoft's Active Template Library (ATL) uses CRTP comprehensively.
  13. [13]
    Setting up a static link to the Registrar code (C++ only)
    Jun 24, 2025 · How to statically link C++ code to the ATL Registrar code ... Static linking of the Registrar's parser adds approximately 5K to a release build.
  14. [14]
    [PDF] ATL COM Desktop Components
    The Active Template Library (ATL) is a set of template-based C++ classes that let you create small, fast. Component Object Model (COM) objects. It has special ...
  15. [15]
    Data Execution Prevention - Win32 apps - Microsoft Learn
    May 1, 2023 · Applications written to the Active Template Library (ATL) version 7.1 and earlier can attempt to execute code on pages marked as non-executable, ...
  16. [16]
    New and Upgraded Features in Visual Studio .NET 2003
    These and other new features of the .NET Framework 1.1 and Visual Studio .NET 2003, including mobile support and improved debugging, are discussed here.
  17. [17]
    Microsoft C/C++ change history 2003 - 2015
    Oct 3, 2025 · This article describes all the breaking changes from Visual Studio 2015 going back to Visual Studio 2003.
  18. [18]
    Microsoft Security Bulletin MS09-035 - Moderate
    Jul 28, 2009 · What is ATL? The Active Template Library (ATL) is a set of template-based C++ classes that let you create small, fast Component Object Model ...<|control11|><|separator|>
  19. [19]
    ATL and MFC changes and fixes in Visual Studio 2013
    Aug 20, 2013 · One of the major changes we made was to eliminate the ATL DLL altogether. All ATL code is now static, either in the header files or in the ATL ...Missing: fully | Show results with:fully
  20. [20]
    Is ATL still supported and developed - Microsoft Q&A
    May 15, 2022 · Yes, ATL is supported in visual studio 2022. It continues to be an effective tool for working with COM in C++.
  21. [21]
    CComModule Class | Microsoft Learn
    Aug 2, 2021 · CComModule implements a COM server module, allowing a client to access the module's components. CComModule supports both DLL (in-process) and EXE (local) ...
  22. [22]
    CAtlModule Class | Microsoft Learn
    Aug 2, 2021 · This class replaces the obsolete CComModule Class used in earlier versions of ATL. Inheritance Hierarchy. _ATL_MODULE. CAtlModule. Requirements.
  23. [23]
    CComObject Class - Microsoft Learn
    Dec 1, 2022 · CComObject implements IUnknown for a nonaggregated object. However, calls to QueryInterface, AddRef, and Release are delegated to CComObjectRootEx.Missing: handle | Show results with:handle
  24. [24]
    CComObjectRootEx Class - Microsoft Learn
    Aug 2, 2021 · This class provides methods to handle object reference count management for both nonaggregated and aggregated objects.Missing: CRTP | Show results with:CRTP
  25. [25]
  26. [26]
    CComVariant class
    ### Summary of `CComVariant` Class in ATL
  27. [27]
    CComSafeArray Class
    ### Summary of `CComSafeArray` Class in ATL
  28. [28]
    CComHeapPtr Class
    ### Summary of CComHeapPtr for COM Heap Allocation in ATL, RAII
  29. [29]
    CAtlArray Class
    ### Summary of CAtlArray for Dynamic Arrays in ATL with RAII
  30. [30]
    Implementing CComObject, CComAggObject, and CComPolyObject
    Jun 24, 2025 · The template classes CComObject, CComAggObject, and CComPolyObject are always the most derived classes in the inheritance chain.Missing: CRTP | Show results with:CRTP
  31. [31]
    CComCoClass Class - Microsoft Learn
    Mar 3, 2025 · CComCoClass provides methods for retrieving an object's CLSID, setting error information, and creating instances of the class.
  32. [32]
    Changing the Default Class Factory and Aggregation Model
    Jun 24, 2025 · ATL uses CComCoClass to define the default class factory and aggregation model for your object. CComCoClass specifies the following two macros.
  33. [33]
    IDispatchImpl Class - Microsoft Learn
    Aug 3, 2021 · IDispatchImpl provides a default implementation for the IDispatch part of any dual interface on an object. A dual interface derives from ...Syntax · Members
  34. [34]
    Implementing a Dual Interface (ATL) | Microsoft Learn
    Aug 2, 2021 · You can implement a dual interface using the IDispatchImpl class, which provides a default implementation of the IDispatch methods in a dual interface.
  35. [35]
    IConnectionPointContainerImpl Class - Microsoft Learn
    Aug 3, 2021 · IConnectionPointContainerImpl implements a connection point container to manage a collection of IConnectionPointImpl objects.
  36. [36]
    Connection Points Classes (ATL) - Microsoft Learn
    Aug 3, 2021 · The following classes provide support for connection points: IConnectionPointContainerImpl Implements a connection point container.
  37. [37]
    CComAggObject Class - Microsoft Learn
    Aug 3, 2021 · This class implements the IUnknown interface for an aggregated object. By definition, an aggregated object is contained within an outer ...
  38. [38]
    COM Map Macros | Microsoft Learn
    Apr 22, 2022 · BEGIN_COM_MAP, Marks the beginning of the COM interface map entries. ; END_COM_MAP, Marks the end of the COM interface map entries.
  39. [39]
    Compiler COM Support Classes | Microsoft Learn
    Aug 3, 2021 · Wraps the BSTR type to provide useful operators and methods. _com_error, Defines the error object thrown by _com_raise_error in most failures.
  40. [40]
    _com_ptr_t Class | Microsoft Learn
    Aug 3, 2021 · A _com_ptr_t object encapsulates a COM interface pointer and is called a "smart" pointer. This template class manages resource allocation and deallocation.Missing: _bstr_t _variant_t _com_error documentation
  41. [41]
  42. [42]
    _com_error Class | Microsoft Learn
    Nov 18, 2022 · A _com_error object represents an exception condition detected by the error-handling wrapper functions in the header files generated from the type library.Missing: _bstr_t _variant_t
  43. [43]
    #import directive (C++) | Microsoft Learn
    Apr 23, 2025 · Used to incorporate information from a type library. The content of the type library is converted into C++ classes, mostly describing the COM interfaces.
  44. [44]
    Visual C++ What's New 2003 through 2015 - Microsoft Learn
    Oct 3, 2025 · This library also compares different kinds of integers. New Active Template Library (ATL) macros. New macros have been added to ATL to expand ...<|control11|><|separator|>
  45. [45]
    Compiler Warnings by compiler version | Microsoft Learn
    Mar 31, 2025 · 23918 . Warning, Message. C4467, usage of ATL attributes is deprecated. C4596, 'name': illegal qualified name in member declaration. C4598 ...
  46. [46]
  47. [47]
    Creating an ATL Project - Microsoft Learn
    Aug 3, 2021 · To create an ATL project using the ATL Project Wizard · In Visual Studio, choose File > New > Project from the main menu. · Select the ATL Project ...
  48. [48]
    Adding an ATL Simple Object - Microsoft Learn
    Aug 3, 2021 · You can use the ATL Project Wizard to create an ATL application, or add an ATL object to your MFC application to implement ATL support for an ...<|control11|><|separator|>
  49. [49]
    Adding an ATL Control | Microsoft Learn
    Aug 3, 2021 · In the Add Class dialog box, in the templates pane, click ATL Control, and then click Add to display the ATL Control Wizard. Using the ATL ...<|control11|><|separator|>
  50. [50]
    ATL Simple Object Wizard | Microsoft Learn
    Aug 2, 2021 · This wizard inserts into the project a minimal COM object. Use this page of the wizard to specify the names that identify the C++ class and files for your ...
  51. [51]
    ATL Wizards and Dialog Boxes - Microsoft Learn
    Aug 2, 2021 · The Active Template Library (ATL) wizards generate boilerplate code for various kinds of COM objects. You can run the wizards by opening the shortcut menu.Missing: key | Show results with:key
  52. [52]
    Using Replaceable Parameters (ATL Registrar) - Microsoft Learn
    Jun 24, 2025 · Instead, replace it with your own UpdateRegistry method that calls CAtlModule::UpdateRegistryFromResourceD or CAtlModule:: ...
  53. [53]
    CAtlDllModuleT Class - Microsoft Learn
    Aug 3, 2021 · ... registry for ... registration. For more information on modules in ATL, see ATL Module Classes. Inheritance Hierarchy. _ATL_MODULE · CAtlModule.
  54. [54]
    Set C++ Compiler and Build Properties in Visual Studio
    For example, an Active Template Library (ATL) project has properties related to Microsoft Interface Definition Language (MIDL) files, but these properties ...
  55. [55]
    Add an IDL method | Microsoft Learn
    Jun 24, 2025 · The Add IDL Method wizard adds a method to an Interface Definition Library (IDL) interface, such as in an ATL project that contains an IDL file.
  56. [56]
    CMake projects in Visual Studio | Microsoft Learn
    Nov 4, 2025 · Visual Studio's native support for CMake allows you to edit, build, and debug CMake projects on Windows, the Windows Subsystem for Linux (WSL), and remote ...Install the C++ Linux Workload... · Create C++ cross-platform...Missing: ATL | Show results with:ATL
  57. [57]
    atl - vcpkg package
    A stub package that ensures Visual Studio has Active Template Library (ATL) installed. Dependencies; Features; Versions; Port Content ...
  58. [58]
    Fundamentals of ATL COM Objects | Microsoft Learn
    Aug 3, 2021 · CComObjectRoot or CComObjectRootEx manages the reference count and outer pointers of IUnknown . Other aspects of your ATL COM object are handled ...Missing: CRTP | Show results with:CRTP
  59. [59]
    Implementing CComObjectRootEx - Microsoft Learn
    Jun 25, 2025 · CComObjectRootEx is essential; all ATL objects must have one instance of CComObjectRootEx or CComObjectRoot in their inheritance.Missing: CRTP | Show results with:CRTP
  60. [60]
    Creating the Project (ATL Tutorial, Part 1) - Microsoft Learn
    Jun 24, 2025 · To create an ATL project, use the ATL Project Wizard, select MFC/ATL, then ATL Project, and name it. Set Application type to DLL.
  61. [61]
    Adding a Control (ATL Tutorial, Part 2) - Microsoft Learn
    Jun 24, 2025 · From the list of templates on the right, select ATL Control. Click Add. The ATL Control wizard will open, and you can configure the control.
  62. [62]
    CComControl Class
    ### Summary of CComControl for ActiveX Controls
  63. [63]
    CAxDialogImpl Class | Microsoft Learn
    Aug 2, 2021 · This class implements a dialog box (modal or modeless) that hosts ActiveX controls. ... For more information on CAxDialogImpl , see ATL Control ...
  64. [64]
    Active Template Library (ATL) Tutorial - Microsoft Learn
    Jun 24, 2025 · This tutorial leads you through the creation of an ActiveX control, demonstrating many ATL and COM fundamentals.
  65. [65]
    Adding an Event (ATL Tutorial, Part 5) - Microsoft Learn
    May 15, 2022 · In this step, you will add a ClickIn and a ClickOut event to your ATL control. You will fire the ClickIn event if the user clicks within the polygon and fire ...
  66. [66]
    Specifying Property Pages (ATL) - Microsoft Learn
    Jun 24, 2025 · When generating a standard control using the ATL Control Wizard, you will only have to add the PROP_PAGE entries to the property map. The wizard ...<|control11|><|separator|>
  67. [67]
    Changing the Drawing Code (ATL Tutorial, Part 4) | Microsoft Learn
    May 15, 2022 · Modifying the OnDraw Method ... After adding FireViewChange , rebuild and try the control again in the ActiveX Control Test Container.
  68. [68]
    Putting the Control on a Web Page (ATL Tutorial, Part 7)
    Aug 16, 2022 · Putting the Control on a Web Page (ATL Tutorial, Part 7) · In this article · Adding new functionality · Scripting the Web Page · Indicating that the ...To Add Control Features · Scripting The Web Page · To Script The Web Page
  69. [69]
    Visual Studio 2015 Update 2 | Microsoft Learn
    Sep 9, 2025 · In this release, we've updated the C++ compiler and standard library with enhanced support for C++11 and C++14 features, as well as preliminary ...
  70. [70]
    [BUILD_FAILED] with \vcpkg install atl:x64-windows --triplet ... - GitHub
    May 1, 2024 · From the log: Unable to locate 'atlbase.h'. Ensure you have installed the Active Template Library (ATL) component of Visual Studio.
  71. [71]
    Visual Studio 2022 version 17.0 Release Notes - Microsoft Learn
    This version of Visual Studio 2022 is no longer supported. The latest supported version is 17.14. Update your install or upgrade to the latest version of Visual ...
  72. [72]
    Visual Studio 2022 Release History | Microsoft Learn
    Visual Studio 2022 version 17.14 on the Current Channel will be supported for the remainder of the 10-year product lifecycle until January 2032. Evergreen ...Visual Studio 2022 version... · Visual Studio 2019 Releases · Microsoft Ignite
  73. [73]
    C++ Tools and Features in Visual Studio Editions - Microsoft Learn
    Visual Studio includes the following workloads for C++ development. You can install any or all of these, along with other workloads such as .NET Desktop ...
  74. [74]
    Is the ATL incompatibility with DEP fixable? - Stack Overflow
    Sep 17, 2011 · ATL uses thunks to manage callbacks for windows, and apparently it needs to allow for data execution. Microsoft says: Note that system DEP ...How to make my program DEP-compatible? - Stack OverflowTrack Data Execution Prevention (DEP) - c++ - Stack OverflowMore results from stackoverflow.com
  75. [75]
    Understanding DEP as a mitigation technology part 1 - Microsoft
    Jun 12, 2009 · “ATL thunk emulation” is not used when a process is forced to use DEP via either the ExecuteOptions registry setting or /NXCOMPAT linker switch.<|control11|><|separator|>
  76. [76]
    replacing deprecated atl attribut - visual c++ 2015 - Stack Overflow
    Dec 20, 2016 · To replace [string] or another ATL attribute, the generic solution is to enable Expand Attributed Source option in project settings.c++ - VS 2010 and atl attributes - deprecated or not? - Stack OverflowWhy the option to use attributes in new ATL projects was removed ...More results from stackoverflow.com
  77. [77]
    Cross-platform support for various MFC\ATL classes - Stack Overflow
    Nov 6, 2010 · Instead of CString use std::string. Instead of CTime use boost::ptime. Instead of CTimeSpan use boost::time_duration.How can I use COM ATL project in Linux? - Stack OverflowIs it possible to compile programs that use ATL using GCC (MinGW ...More results from stackoverflow.com
  78. [78]
    Microsoft Security Advisory 973882
    The Active Template Library (ATL) is a set of template-based C++ classes that lets you create small, fast Component Object Model (COM) objects. ATL has special ...<|control11|><|separator|>
  79. [79]
    MS09-060: Vulnerabilities in Microsoft Active Template Library...
    MS09-060 allows remote code execution via Microsoft Office ActiveX controls in Outlook/Visio due to ATL vulnerabilities, including VariantClear and ...Missing: limitations | Show results with:limitations
  80. [80]
    [PDF] Vista and ActiveX control - Black Hat
    This article covers security issues of ActiveX control on Windows Vista. Windows Vista has some new security mechanisms such as the UAC (User Account ...
  81. [81]
    July Patch Partly Addresses ActiveX Holes - Redmondmag.com
    Jul 14, 2009 · In both situations, implementing the best practice of least privilege can have significant security benefits. ... ActiveX security bulletins.
  82. [82]
    ATL Virtual Functions and vtables - C++ Q&A - Microsoft Learn
    Oct 24, 2019 · ATL provides many such classes using templates, another source of class proliferation. ... The total bloat can become significant ...
  83. [83]
    Guidance on Authoring and Consuming COM Components in ...
    Mar 17, 2025 · The project is being developed using Visual Studio 2022, and I've explored the following tech stacks for both authoring and consuming COM: ATL ( ...
  84. [84]
    Windows Runtime C++ Template Library (WRL) | Microsoft Learn
    Oct 17, 2022 · Windows Runtime C++ Template Library resembles the Active Template Library (ATL) because you can use it to create small, fast COM objects.
  85. [85]
    Windows with C++ - COM Smart Pointers Revisited | Microsoft Learn
    ... Windows Runtime C++ Template Library (WRL), which some hailed as a modern replacement for the ATL CComPtr. At first, I also thought this was a good step ...
  86. [86]
    Exposing .NET Core components to COM - Microsoft Learn
    Jul 26, 2024 · This tutorial shows you how to expose a class to COM from .NET Core. You generate a COM server and a side-by-side server manifest for ...Create The Library · Register The Com Host For... · Enabling Regfree ComMissing: ATL | Show results with:ATL
  87. [87]
    By which I can replace the use of ATL to have an equal or a better ...
    Mar 21, 2014 · I'm new to ATL developement. Refering to some links in the Net, COM is outdated by .NET. Is there any technologie that replaces ATL? ATL is ...Modern .NET equivalent for COM interop - Stack Overflowc# - excel interop alternative - Stack OverflowMore results from stackoverflow.comMissing: interop | Show results with:interop