如何从dll中读取运行时类信息

如何从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) \

我们有1个遗留MFC项目(exe)使用类似Implementure_SERIAL(ItemA,BaseItem,0)的东西进行序列化,最近我们发现ItemA也涉及视图操作,所以我们决定将持久性部分分离到单个模块(dll)。然而,当我们在应用更改后尝试从外部文件反序列化时,会引发异常

我发现IMPLEMENT_SERIAL macro做了如下类似于本地注册的事情:

#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后得到解决,再次感谢。