我们有1个遗留MFC项目(exe)使用像IMPLEMENT_SERIAL(ItemA,BaseItem,0)进行序列化,最近我们发现ItemA也涉及视图操作,所以我们决定将持久性部分分离到单个模块(dll)。但是,在应用更改后尝试从外部文件反序列化时会引发异常。
我发现IMPLEMENT_SERIAL宏确实像本地注册一样,如下所示:
#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \
extern AFX_CLASSINIT _init_##class_name; \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
class_name::CreateObject, &_init_##class_name) \
AFX_CLASSINIT _init_##class_name(RUNTIME_CLASS(class_name)); \
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
return ar; }
分离到单个模块的持久性部分也应该在dll中注册,但是无法从exe访问它,所以有没有办法读取这些RUNTIME_CLASS信息?或者我应该将单个模块作为静态库而不是dll?
提前感谢。
答案 0 :(得分:3)
只有拥有扩展DLL时,Runtime类实现才适用于DLL。 请参阅MSDN。
标准DLL不与其他模块(此处为EXE)共享其类。
当extension DLL is initialized放入资源链时。这还包括CRuntimeClass对象列表。最后的事情是在AfxInitExtensionModule内部和CDynLinkLibrary的构造函数中完成的。
只需查看向导使用扩展DLL创建的代码。
请记住,在DLL中使用此功能始终要求MFC也用作DLL。
创建静态库将解决问题,但如果在许多模块中使用此类代码,最好在DLL中提取代码并使用MFC作为共享资源。