• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 420
  • Last Modified:

Re-open the open Document

I would like to open, and therefore re-initialize, the MFC document which is currently open. This is a SDI application.
The default behavior is to NOT reload a file (ie. de-serialize a document) if it is the current document. Selecting the file from either the MRU list or the Open Dialog only works when the selected file is not the current open document, weither dirty or not.
Is there some way to tell MFC to allow document re-loading? or extend the framework in some fashion (probably CWinApp or CDocManager)?
  • 2
1 Solution
Hi reichj,

You will need to extend CSingleDocTemplate().

CMySingleDocTemplate : public CSingleDocTemplate
  ... construction/destruction
  see ...\mfc\include\afxwin.h for CDocTemplate() source

Now override MatchDocTemplate()
      Confidence MatchDocType(LPCTSTR pszPathName, CDocument*& rpDocMatch);

Confidence CMySingleDocTemplate::MatchDocType(...)
  Confidence match;
  match = CSingleDocTemplate::MatchDocType(...);

  // This is the main part. Fool the calling fuction into believing that the document is not open
  if (match == CDocTemplate::yesAlreadyOpen)
  match = CDocTemplate::noAttempt;

  return match;

Hope this helps


Now use CMySingleDocTemplate wherever you would use CSingleDocTemplate
reichjAuthor Commented:

Thanks for the response.
Unfortunatly the code did'nt work perfectly at first. By the speed of your response I believe the code did work in the past, maybe on an older version of MFC (I'm using VC++ ver 5.0).
It seems CDocManager::OpenDocumentFile() (in docmgr.cpp) needs a little re-writing (I'll leave that up to microsoft). In any event 'match' is not tested, instead 'rpDocMatch' is tested against NULL to see if MatchDocType() has an already open doc. On top of that, setting 'match' to CDocTemplate::noAttempt forces a "Failed to open Doc" messagebox to appear.

According to the documentation :

If the file is not open but the extension in lpszPathName matches the extension specified by CDocTemplate::filterExt, this function returns CDocTemplate::yesAttemptNative and sets rpDocMatch to NULL

Thus, the body of CMySingleDocTemplate::MatchDocType() should be

Confidence MatchDocType(LPCTSTR lpszPathName, CDocument*& rpDocMatch)
      Confidence match;
      match = CSingleDocTemplate::MatchDocType(lpszPathName, rpDocMatch);

      // Fool calling function into believing that the
      // Doc is not open.
      if (match == CDocTemplate::yesAlreadyOpen){
            match = CDocTemplate::yesAttemptNative;
            rpDocMatch = NULL;
            POSITION p = GetFirstDocPosition();
      return (match);

I also clear the Modified flag since it doesnt make much sense to get a SaveFile dialog prior to opening the same Doc. Of course just using the first doc position only works for an SDI app.

Jeff Reich


Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now