BUG: You receive an error LNK2001 when you try to use the >> operator to serialize one of the extension DLL classes in Visual C++ (152254)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), when used with:
- Microsoft Visual C++, 32-bit Editions 4.0
- Microsoft Visual C++, 32-bit Editions 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Enterprise Edition 5.0
- Microsoft Visual C++, 32-bit Enterprise Edition 6.0
- Microsoft Visual C++, 32-bit Professional Edition 4.2
- Microsoft Visual C++, 32-bit Professional Edition 5.0
- Microsoft Visual C++, 32-bit Professional Edition 6.0
- Microsoft Visual C++, 32-bit Learning Edition 6.0
- Microsoft Visual C++ .NET (2003)
- Microsoft Visual C++ .NET (2002)
This article was previously published under Q152254 SYMPTOMS When attempting to build an application that uses classes
from an MFC extension DLL, the linker reports an error of the form:
mainfrm.obj : error LNK2001: unresolved external symbol
"class CArchive & __stdcall operator>>
(class CArchive &,class CClassInExtDLL * &)"
(??5@YGAAVCArchive@@AAV0@AAPAVCDummyDoc@@@Z)
Specifically, this problem occurs for code that
attempts to use the >> operator to serialize one of the extension DLL
classes that use the DECLARE_SERIAL macro. CAUSE If an exported class is declared in an extension DLL and is
made serializable by the use of the macros DECLARE_SERIAL and IMPLEMENT_SERIAL,
the global function:
friend CArchive& AFXAPI operator>>(CArchive& ar, CMyObject* &pOb);
is not automatically exported along with the class. Therefore, if an
application tries to serialize an object of that class type by the use of the
>> operator, a LNK2001 unresolved external error occurs on operator
>>. RESOLUTION Create a new macro based on the DECLARE_SERIAL macro:
#define DECLARE_SERIAL_EXTDLL(class_name) \
_DECLARE_DYNCREATE(class_name) \
AFX_EXT_API friend CArchive& AFXAPI \
operator>>(CArchive& ar, class_name* &pOb);
After defining this macro, use this new DECLARE_SERIAL_EXTDLL macro in
place of DECLARE_SERIAL in the class declaration. Rebuild the DLL and link its
new import library with the application. In this resolution, the
AFX_EXT_API prefix resolves the LNK2001 error by explicitly exporting the
function operator>> when building the extension DLL. STATUS Microsoft has confirmed this to be a bug in the Microsoft
products listed at the beginning of this article. REFERENCES For additional information on serialization and how to
export classes from extension DLL's, please see: - MFC TechNote #2 in the Books Online
- MFC TechNote #33 in the Books Online
For more information, click the following article number to view the article in the Microsoft Knowledge Base:
131946
Bad pointer from RUNTIME_CLASS with class from _AFXDLL
Modification Type: | Major | Last Reviewed: | 6/2/2005 |
---|
Keywords: | kbtshoot kberrmsg kbBug kbDLL kbProgramming KB152254 kbAudDeveloper |
---|
|