In ATL 2.1, the IObjectSafetyImpl class marked the control as being safe for scripting. For security reasons, this default has been removed, so you must explicitly specify your safety options using the second template parameters. You must now expose this class using COM_INTERFACE_ENTRY rather than COM_INTERFACE_ENTRY_IMPL.
ATL 3.0 uses the compiler keyword __uuidof( class ) to obtain the corresponding IID for a given class. Because of changes in the COM_INTERFACE_ENTRY macros, now you simply include the header for the interface to use, instead of also linking to a library that defines the matching IIDs for that interface. This change can cause problems if the header was previously generated by an old version of MIDL, or if it was hand-coded and not marked appropriately.
If the declaration for the interface in the header has not been marked with an associated __declspec(uuid), then any attempt to use the __uuidof() keyword for that interface will fail. You can revert to the old style (ATL 2.x) COM_INTERFACE_ENTRY macros by defining _ATL_NO_UUIDOF in your build settings to work around any problems with this new behavior.
In addition to _ATL_DEBUG_QI and _ATL_DEBUG_REFCOUNT, present in ATL 2.x, there is the new _ATL_DEBUG_INTERFACES, which will trace to the debug console any interface leaks that are detected when _Module.Term
is called (when the server shuts down).
See Also
Debugging Tips for ATL Objects
Macro | Comment |
COM_INTERFACE_ENTRY_IMPL | Obsolete. Replace with COM_INTERFACE_ENTRY. |
COM_INTERFACE_ENTRY_IMPL_IID | Obsolete. Replace with COM_INTERFACE_ENTRY_IID. |
CHAIN_MSG_MAP_ALT_DYNAMIC | Obsolete and deleted. |
BEGIN_PROPERTY_MAP | Obsolete. Use the new property map macro, BEGIN_PROP_MAP, as described in New Macros. |
END_PROPERTY_MAP | Obsolete. Use the new property map macro, END_PROP_MAP, as described in New Macros. |