我正在使用MFC的CArhive类为我的应用保存一个项目文件。其中一个类名非常不准确,我想要更改它,但简单地到处更改名称会使以前的归档文件变得无用,并出现归档错误。有没有一种方法可以更改存档类的名称,而不会使以前保存的所有文件变得无用?
当然,这不需要使用typedef访问具有新名称的现有类,也不需要保留具有旧名称的类的版本以读取归档文件,并将读取的对象复制到具有新名称的同一个类中。
发布于 2010-11-05 23:09:52
关键的一点是,当您使用DECLARE_SERIAL和IMPLEMENT_SERIAL时,会将一个CRuntimeClass成员添加到您的类中,该类的m_lpszClassName字段中包含该名称。此CRuntimeClass对象还会添加到由框架维护的列表中,该列表在动态创建类时进行搜索。您需要确保CRuntimeClass对象包含m_lpszClassName中的类的旧名称。
您有两个选项:
CRuntimeClass对象的构造以设置名称m_lpszClassName字段后更改存储在其字段中的类名
重写CRuntimeClass对象的构造
为此,您需要创建自己的DECLARE_DYMAMIC、DECLARE_DYNCREATE、DECLARE_SERIAL、IMPLEMENT_DYMAMIC、IMPLEMENT_DYNCREATE和IMPLEMENT_SERIAL版本。您可以只复制并重命名现有的实现。在您的IMPLEMENT_DYNAMIC版本中,需要更改构造CRuntimeClass的代码,以便使用旧类的名称对其进行初始化。
在创建CRuntimeClass对象后更改存储在m_lpszClassName字段中的类名
由于CRuntimeClass是由静态初始化器创建的,因此我不认为您可以在类中执行此操作。我认为最好的地方是在应用程序的InitInstance中。将static char*变量添加到包含旧类名的应用程序类中。然后,在InitInstance中,在类的CRuntimeClass中设置m_lpszClassName字段。
无论哪种方式,首先要做的就是完全熟悉动态创建和序列化的工作方式。
发布于 2011-06-08 15:20:32
我选择了第三个选项。我最初将我的一个可序列化类命名为MFC,这在VC6.0上似乎不是问题;但在VS2010上有一个名为CEvent的CEvent内置类,所以我必须更改它。
因此,我通过在调用COleServerDoc::OnOpenDocument之前修改旧格式文件来修复它
我只是简单地打开,读到内存,找到并替换CEvent与任何其他6个字符(必须是相同大小)的类名,写入并保存为新的文件名,然后打开并读取新的文件,没有问题。
我正在更改新版本的文件扩展名,所以一切都解决了。
https://stackoverflow.com/questions/4107076
复制相似问题