Serlialize in MFC-DLL
-
Hallo,
ich hab eine MFC-DLL erstellt, in der die Klassen, die ich per AFX_EXT_CLASS exportiere von CObject abgeleitet sind und deshalb die DECLARE_SERIAL und IMPLEMENT_SERIAL Makros verwenden. Kompilieren der DLL ist kein Problem, wenn ich jedoch die DLL in einer Anwendung verwenden und dort aus einem CArchive ein Objekt laden will, dann sagt der Linker:
error LNK2001 Nicht aufgelöstes externes Symbol "class CArchive & __stdcall operator >>(class CArchive &, class MyClass * &)" (...
Wo liegt das Problem? Kann mir da bitte jemand helfen! Thanx
-
Linker-Problem:
Das Makro IMPLEMENT_SERIAL unterstützt in der Standardausführung den DLL-Export des operators >> nicht.
#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \ CObject* PASCAL class_name::CreateObject() \ { return new class_name; } \ AFX_COMDAT AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \ _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \ class_name::CreateObject, &_init_##class_name) \ CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \ { pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \ return ar; } \
Musst Du also per #undef löschen und mit dllexport neu definieren.
-
Jo, thanx!
Gibt also gar keinen Grund, mich mit Dir zu kloppen (wie ich gerade gelesen habe)
Zur Vollständigkeit:
DECLARE_SERIAL muss auch angepasst werden!
Ich hab kein #undef gemacht sondern das ganz folgendermaßen gelöst:
#define DECLARE_SERIAL_DLL(class_name) \ _DECLARE_DYNCREATE(class_name) \ __declspec(dllexport) AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb); #define IMPLEMENT_SERIAL_DLL(class_name, base_class_name, wSchema) \ CObject* PASCAL class_name::CreateObject() \ { return new class_name; } \ _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \ class_name::CreateObject) \ AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \ _declspec(dllexport) CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \ { pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \ return ar; } \
Vielleicht was für die FAQ?