MFC を使った Document/View モデルのアプリケーションにて、 Serialize() メソッドの引数の CArchive が持っているファイルを開きっぱなしにしたいことがありました。
色々やってみた結果、CArchive が持っている CFile からファイルハンドルを取得して、それを DuplicateHandle() APIで複製し、その複製したファイルハンドルを元に新しい CFile を作ることでうまくできました。
<CODE> // CViewXxxx コンストラクション/デストラクション CViewXxxx::CViewXxxx() : file(NULL) { // TODO: この位置に1度だけ呼ばれる構築用のコードを追加してください。 /* ... */ } CViewXxxx::~CViewXxxx() { /* ... */ delete file; file = NULL; /* ... */ } // CViewXxxx シリアル化 void CViewXxxx::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: 格納するコードをここに追加してください。 } else { // TODO: 読み込むコードをここに追加してください。 if (file != NULL) { delete file; file = NULL; } HANDLE localFile; DuplicateHandle( GetCurrentProcess(), ar.GetFile()->m_hFile, GetCurrentProcess(), &localFile, 0, TRUE, DUPLICATE_SAME_ACCESS); file = new CFile(localFile); } } </CODE>