我正在使用MFC的CArhive类来保存我的应用程序的项目文件。其中一个类名称非常不准确,我想更改它,但只是更改名称到处都会使以前的存档文件无法处理存档错误。有没有办法更改已归档类的名称而不会使以前保存的所有文件无效?
当然,没有使用typedef来访问具有新名称的现有类,或者保留具有旧名称的类的版本以读取存档文件并将读入的对象复制到具有新名称的同一类中
答案 0 :(得分:8)
关键是,当您使用DECLARE_SERIAL
和IMPLEMENT_SERIAL
时,CRuntimeClass
成员会添加到您的m_lpszClassName
字段中包含该名称的类中。
此CRuntimeClass
对象也会添加到由动态创建类时搜索的框架维护的列表中。
您需要确保CRuntimeClass
对象在m_lpszClassName
中包含您班级的旧名称。
你有两个选择:
覆盖建筑物
CRuntimeClass
对象设置名称
更改存储在其中的班级名称
m_lpszClassName
之后的字段
已创建
要执行此操作,您需要制作自己的DECLARE_DYMAMIC
,DECLARE_DYNCREATE
,DECLARE_SERIAL
,IMPLEMENT_DYMAMIC
,IMPLEMENT_DYNCREATE
和{{1}版本}}。
您只需复制和重命名现有实现即可。
在您的IMPLEMENT_SERIAL
版本中,您需要更改构造IMPLEMENT_DYNAMIC
的代码,以便使用旧类的名称对其进行初始化。
由于CRuntimeClass
是由静态初始值设定项创建的,因此我认为您不能在类中执行此操作。
我认为最好的地方是你的应用程序CRuntimeClass
。
将InitInstance
变量添加到包含旧类名的应用程序类中。
然后,在static char*
中,在班级InitInstance
中设置m_lpszClassName
字段。
无论哪种方式,首先要做的是完全熟悉动态创建和序列化工作的方式。
答案 1 :(得分:0)
我选了第3个选项。我最初命名了一个可序列化的类CEvent
,这在VC6.0上似乎没有问题;但在VS2010上有一个名为CEvent
的MFC内置类,所以我不得不改变它。
所以,我在调用COleServerDoc::OnOpenDocument
我只是,打开,读取内存,找到并替换CEvent
与任何其他6个字符(必须大小相同)的类名,写入并保存为新文件名,然后打开并读取新文件,否问题
无论如何,我正在更改新版本的文件扩展名,所以一切顺利。