如何从DLL读取RUNTIME_CLASS信息

时间:2014-04-15 08:36:35

标签: dll mfc

我们有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?

提前感谢。

1 个答案:

答案 0 :(得分:3)

只有拥有扩展DLL时,Runtime类实现才适用于DLL。 请参阅MSDN

标准DLL不与其他模块(此处为EXE)共享其类。

extension DLL is initialized放入资源链时。这还包括CRuntimeClass对象列表。最后的事情是在AfxInitExtensionModule内部和CDynLinkLibrary的构造函数中完成的。

只需查看向导使用扩展DLL创建的代码。

请记住,在DLL中使用此功能始终要求MFC也用作DLL。

创建静态库将解决问题,但如果在许多模块中使用此类代码,最好在DLL中提取代码并使用MFC作为共享资源。