如何从dll中读取运行时类信息
我们有1个遗留MFC项目(exe)使用类似Implementure_SERIAL(ItemA,BaseItem,0)的东西进行序列化,最近我们发现ItemA也涉及视图操作,所以我们决定将持久性部分分离到单个模块(dll)。然而,当我们在应用更改后尝试从外部文件反序列化时,会引发异常 我发现IMPLEMENT_SERIAL macro做了如下类似于本地注册的事情:如何从dll中读取运行时类信息,dll,mfc,Dll,Mfc,我们有1个遗留MFC项目(exe)使用类似Implementure_SERIAL(ItemA,BaseItem,0)的东西进行序列化,最近我们发现ItemA也涉及视图操作,所以我们决定将持久性部分分离到单个模块(dll)。然而,当我们在应用更改后尝试从外部文件反序列化时,会引发异常 我发现IMPLEMENT_SERIAL macro做了如下类似于本地注册的事情: #define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
#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中注册sth,但是它不能从exe访问,所以有没有办法读取这些运行时类信息?或者我应该将单个模块作为静态库而不是dll
提前感谢。只有当您有扩展DLL时,运行时类实现才适用于DLL。 看 标准DLL不与其他模块(此处为EXE)共享其类 当一个项目被放入资源链时。这还包括CRuntimeClass对象列表。最后一件事是在CDynLinkLibrary的内部和构造函数中完成的 只需查看向导使用扩展DLL创建的代码 请记住,在DLL中使用此功能始终要求MFC也用作DLL
创建静态库将解决此问题,但如果您在许多模块中使用此类代码,则最好在DLL中提取代码,并将MFC用作共享资源。问题在按照您的建议将模块更改为MFC扩展DLL后得到解决,再次感谢。