In Microsoft Visual C++, if the version of the compiler is older than a specific version, 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 LNK2001
error for the symbol name of the GUID, the GUID was not initialized.
Note The DEFINE_GUID macro in the guiddef.h header file declares a GUID. To also define the GUID, include the INITGUID.H header file in the source file where the GUID should be defined.
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 OBJBASE.H. (OBJBASE.H is included by OLE2.H.)
Note If the version of the compiler is newer than a specific version, when you are using precompiled headers, you can include the INITGUID.H header file in a single header file that includes other header files. This will cause the GUID to be defined in all the source files where this header file is included. You will not receive an LNK2001
error even if a symbol is defined multiple times. This is because a DECLSPEC_SELECTANY keyword is used in the DEFINE_GUID macro. This keyword makes sure that the linker will correctly handle this multiple definition.
Note If the DECLSPEC_SELECTANY keyword is used in OBJBASE.H, the initialization code of the unreferenced object will be discarded. Therefore, if the version of the compiler is newer than a specific version, the error does not occur.