首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重命名MFC CArchive序列化类

重命名MFC CArchive序列化类
EN

Stack Overflow用户
提问于 2010-11-05 22:56:17
回答 2查看 1.1K关注 0票数 6

我正在使用MFC的CArhive类为我的应用保存一个项目文件。其中一个类名非常不准确,我想要更改它,但简单地到处更改名称会使以前的归档文件变得无用,并出现归档错误。有没有一种方法可以更改存档类的名称,而不会使以前保存的所有文件变得无用?

当然,这不需要使用typedef访问具有新名称的现有类,也不需要保留具有旧名称的类的版本以读取归档文件,并将读取的对象复制到具有新名称的同一个类中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-05 23:09:52

关键的一点是,当您使用DECLARE_SERIALIMPLEMENT_SERIAL时,会将一个CRuntimeClass成员添加到您的类中,该类的m_lpszClassName字段中包含该名称。此CRuntimeClass对象还会添加到由框架维护的列表中,该列表在动态创建类时进行搜索。您需要确保CRuntimeClass对象包含m_lpszClassName中的类的旧名称。

您有两个选项:

  1. 重写CRuntimeClass对象的构造以设置名称
  2. 在创建m_lpszClassName字段后更改存储在其

字段中的类名

重写CRuntimeClass对象的构造

为此,您需要创建自己的DECLARE_DYMAMICDECLARE_DYNCREATEDECLARE_SERIALIMPLEMENT_DYMAMICIMPLEMENT_DYNCREATEIMPLEMENT_SERIAL版本。您可以只复制并重命名现有的实现。在您的IMPLEMENT_DYNAMIC版本中,需要更改构造CRuntimeClass的代码,以便使用旧类的名称对其进行初始化。

在创建CRuntimeClass对象后更改存储在m_lpszClassName字段中的类名

由于CRuntimeClass是由静态初始化器创建的,因此我不认为您可以在类中执行此操作。我认为最好的地方是在应用程序的InitInstance中。将static char*变量添加到包含旧类名的应用程序类中。然后,在InitInstance中,在类的CRuntimeClass中设置m_lpszClassName字段。

  • 第一个方法的优点是将更改保留在类本身中。
  • 第二个方法使应用程序以一种它可能不应该知道的方式识别类。

无论哪种方式,首先要做的就是完全熟悉动态创建和序列化的工作方式。

票数 8
EN

Stack Overflow用户

发布于 2011-06-08 15:20:32

我选择了第三个选项。我最初将我的一个可序列化类命名为MFC,这在VC6.0上似乎不是问题;但在VS2010上有一个名为CEventCEvent内置类,所以我必须更改它。

因此,我通过在调用COleServerDoc::OnOpenDocument之前修改旧格式文件来修复它

我只是简单地打开,读到内存,找到并替换CEvent与任何其他6个字符(必须是相同大小)的类名,写入并保存为新的文件名,然后打开并读取新的文件,没有问题。

我正在更改新版本的文件扩展名,所以一切都解决了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4107076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档