Microsoft KB Archive/130868

{|
 * width="100%"|

How to Avoid Error L2029 Unresolved External Using DEFINE_GUID

 * }

Q130868

-

The information in this article applies to:


 * Microsoft Visual C++, versions 1.5, 1.51, 1.52

-

SUMMARY
A GUID must be initialized exactly once. For this reason, there are two different versions of the DEFINE_GUID macro. One version just declares an external reference to the symbol name. The other version actually initializes the symbol name to the value of the GUID. If you receive an L2029 error for the symbol name of the GUID, the GUID was not initialized.

You can make sure your GUID gets initialized in one of two ways:


 * If you are using precompiled header files, include the INITGUID.H header file before defining the GUID in the implementation file where it should be initialized. (AppWizard-generated MFC projects use precompiled headers by default.)
 * If you are not using precompiled headers, define INITGUID before including COMPOBJ.H. (COMPOBJ.H is included by OLE2.H.)

MORE INFORMATION
Here is the definition of DEFINE_GUID as it appears in COMPOBJ.H:

  #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID CDECL FAR name

#ifdef INITGUID #include "initguid.h"  #endif NOTE: If the symbol INITGUID is not defined, then DEFINE_GUID simply defines an external reference to the name.

In INITGUID.H, you find (among other things):

  #undef DEFINE_GUID

// Other Code. ..

#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ EXTERN_C const GUID CDECL __based(__segname("_CODE")) name \ = { l, w1, w2, { b1, b2, b3,  b4,  b5,  b6,  b7,  b8 } } Therefore, include INITGUID.H after COMPOBJ.H DEFINE_GUID is modified to actually initialize the GUID.

NOTE: It is important to make sure that this is done exactly once for each DLL or EXE. If you try to initialize the GUID in two different implementation files and then link them together, you get this error:

L2025: : symbol defined more than once.

Additional query words: kbinf 1.50 1.51 1.52

Keywords : kberrmsg kb16bitonly kbGenInfo kbVC

Issue type :

Technology : kbVCsearch kbAudDeveloper kbvc150 kbVC151 kbVC152