你可以根据给定的文件名自己手工建立这种关联,欲知详情,请查看MSDN中关于CArichive和CFile的构造函数的说明.
Gook Luck!
Gook Luck!
解决方案 »
- CSerialPort的WriteToPort
- [求助]debug和Release 的区别,出现的错误信息~!
- VC技术交流探讨群
- 如何给窗口的滚动条和CListCtrl的CHeaderCtrl贴上自己的皮肤
- 使用ole db访问SQL Server的问题
- 初学请教!我建立了工程,在基类的选择中没有CObject类,要如何解决?请求帮助,谢谢!
- 菜鸟求救,Picture控件
- 关于串口通信的一些疑问:
- 如何用winsock传送,接收一个结构(struct)?
- 有关数据结构的简单问题!!!
- 急!!!!!!!!!MFC 中如何定义及使用全局变量?
- 谁能告诉我AdjustTokenPrivileges(。。。)怎么用?
作为参数以引用的形式传递给序列化函数。事实上,每个Carchive对象都是和CFile
对象相对应的,先有CFile对象,后有CArchive对象。如果你有多个文件打开,看你
是把那个文件与Carchive对象联系在一起的。如果自己想处理ONFILEOPEN消息,自己
生成生成一个CArchive对象就是了,调用函数CArchive( CFile* pFile, UINT
nMode, int nBufSize = 4096, void* lpBuf = NULL )。之后把这个对象作为参数
传递给Serialize()就可以了。
laole回答中说把自己生成的CAchiv对象作为参数传递给Serialize函数,但是Serialize是在读取或写入对象时自动被调用的.看来似乎每个Document都有一个参数在维护着Serialize所操作的文件?
另外是否要操作CFileDialog的部分属性(比如加入文件名的filter),就一定要自己处理ONFILEOPEN呢?自己去调用dlg.DoModal呢?
在你的对象中
打开:
CFileException fe;
//建立lpszPathName对应的CFile对象
CFile* pFile = GetFile(lpszPathName,File::modeRead and CFile::shareDenyWrite,&fe);
//建立CFile对应的ar
CArchive ar(pFile, CArchive::load and CArchive::bNoFlushOnDelete);
//调用你的类的串行化函数
Serialize(ar);
保存:
CFileException fe;
CFile* pFile = NULL;
pFile = GetFile(lpszPathName, CFile::modeCreate and
CFile::modeReadWrite and CFile::shareExclusive, &fe);
CArchive ar(pFile, CArchive::store and CArchive::bNoFlushOnDelete);
Serialize(ar);
这样在ONFILEOPEN对
多个文件的操作时只要对每个文件都进行一次上述操作就可以了.
CDocument::OnOpenDocument(lpFileName)和CDocument::OnSaveDocument(lpFileName)就是这样建立关联的,其实上述这段代码就是从mfc中摘出来的
CFile FLfile;
char buf[512];
if( !FLfile.Open( pFileName, CFile::modeCreate and CFile::modeWrite ) )
{
#ifdef _DEBUG
afxDump << "Unable to open file" << "\n";
exit( 1 );
#endif
}
CArchive ar( &FLfile, CArchive::store, 512, buf );
这样就可以像操作串行化数据一样来对待ar.存储的数据放在了指定的文件中pFileName
虽然serialize是在读取对象是调用的,但是在此之前archive对象就已经生成了
事实上,你可以这样理解每一个文件对象都有一个archive对象把物理数据与逻辑数据
联系起来,简化呢的操作,可以想象成c语言中的流。事实上你自己处理的话,可以用
CFileDialog地DoModal获得文件名,然后进行一系列操作,包括生成File对象和Archive
对象。这个问题netmare和yusuco说的很清楚了,把代码都贴上了。
是否要操作CFileDialog的部分属性(比如加入文件名的filter),就一定要自己处理ONFILEOPEN呢?自己去调用dlg.DoModal呢?
谢谢!
第2个问题:
自己构造CFile对象,然后用CFile对象来CAhrive对象。
具体自己去看以下MFC的原代码。
BOOL CDocument::OnOpenDocument(LPCTSTR lpszPathName)
{
if (IsModified())
TRACE0("Warning: OnOpenDocument replaces an unsaved document.\n"); CFileException fe;
CFile* pFile = GetFile(lpszPathName,
CFile::modeRead and CFile::shareDenyWrite, &fe);
if (pFile == NULL)
{
ReportSaveLoadException(lpszPathName, &fe,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
} DeleteContents();
SetModifiedFlag(); // dirty during de-serialize CArchive loadArchive(pFile, CArchive::load and CArchive::bNoFlushOnDelete);
loadArchive.m_pDocument = this;
loadArchive.m_bForceFlat = FALSE;
TRY
{
CWaitCursor wait;
if (pFile->GetLength() != 0)
Serialize(loadArchive); // load me
loadArchive.Close();
ReleaseFile(pFile, FALSE);
}
CATCH_ALL(e)
{
ReleaseFile(pFile, TRUE);
DeleteContents(); // remove failed contents TRY
{
ReportSaveLoadException(lpszPathName, e,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
}
END_TRY
DELETE_EXCEPTION(e);
return FALSE;
}
END_CATCH_ALL SetModifiedFlag(FALSE); // start off with unmodified return TRUE;
}