Microsoft KB Archive/192561

= PRB: Error C2787 When Building a Project Using ATL 3.0 =

Article ID: 192561

Article Last Modified on 12/10/2003

-

APPLIES TO

 Microsoft ActiveX Template Library 3.0, when used with:  Microsoft Visual C++ 6.0 Enterprise Edition

 Microsoft Visual C++ 6.0 Professional Edition

 Microsoft Visual C++ 6.0 Standard Edition 

-

<div class="notice_section">

This article was previously published under Q192561

<div class="symptoms_section">

SYMPTOMS
When building a project with ATL 3.0 you may get a compiler error c2787 (no GUID has been associated with this object).

<div class="cause_section">

CAUSE
The newer versions of MIDL use the compiler facility [__declspec(uuid)] to tag a GUID to an interface in the header files it generates. ATL version 3.0 makes use of this fact in the implementation of COM_INTERFACE_ENRY macro; it now uses the keyword __uuidof to extract the interface ID from the MIDL-generated header. ATL 2.1 uses the token pasting operator (IID_##IFoo) to get the interface ID. This action requires including the MIDL-generated header and also the "project_i.c", which MIDL generated.

If you use an older MIDL-generated header file [which does not use __declspec(uuid)] with ATL 3.0, you will get this compiler error, because __uudiof can't extract the interface ID.

<div class="resolution_section">

RESOLUTION
Define the preprocessor symbol _ATL_NO_UUIDOF in the C/C++ tab of the Project Settings dialog box. This forces ATL to use the token pasting operator (##) rather than __uuidof when forming the interface ID.

<div class="status_section">

STATUS
This behavior is by design.

<div class="moreinformation_section">

Sample Code
COM_INTERFACE_ENTRY in ATL 2.1 #define COM_INTERFACE_ENTRY(x)\ {&IID_##x), \         offsetofclass(x, _ComMapClass), \          _ATL_SIMPLEMAPENTRY},   COM_INTERFACE_ENTRY in ATL 3.0      #ifndef _ATL_NO_UUIDOF      #define _ATL_IIDOF(x) __uuidof(x)      #else      #define _ATL_IIDOF(x) IID_##x      #endif      #define COM_INTERFACE_ENTRY(x)\          {&_ATL_IIDOF(x), \          offsetofclass(x, _ComMapClass), \          _ATL_SIMPLEMAPENTRY}, Newer MIDL headers files use the macros DECLSPEC_UUID or MIDL_INTERFACE, which expand to __declspec(uuid). MIDL versions 3.01.75 and later use the __declspec directive.

<div class="references_section">