【问题标题】:how to read RUNTIME_CLASS info from dll如何从 dll 中读取 RUNTIME_CLASS 信息
【发布时间】:2014-04-15 08:36:34
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: dll mfc


    【解决方案1】:

    只有当您有扩展 DLL 时,运行时类实现才适用于 DLL。 见MSDN

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

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

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

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

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

    【讨论】:

    • 按照您的建议将模块更改为MFC扩展dll后问题已解决,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多