2017-04-05 2 views
0

L'application principale de ma société utilise des documents OLE. Périodiquement, et de manière imprévisible, le programme ferme incorrectement ses documents modèles. Je pense que le problème pourrait être la façon dont nous fermons les fichiers lorsque l'utilisateur quitte l'application ou choisit Fichier/Fermer dans le menu. Après beaucoup de débogage/traçage, il revient àRELEASE C++ Macro Définition

///////////////////////////////////////////////////////////////////////////// 
// 'Compound File' enabling in COleDocument 

BOOL COleDocument::OnNewDocument() 
{ 
    // call base class, which destroys all items 
    if (!CDocument::OnNewDocument()) 
     return FALSE; 

    // for file-based compound files, need to create temporary file 
    if (m_bCompoundFile && !m_bEmbedded) 
    { 
     // abort changes to the current docfile 
     RELEASE(m_lpRootStg); 

     // create new temporary docfile 
     LPSTORAGE lpStorage; 
     SCODE sc = ::StgCreateDocfile(NULL, STGM_DELETEONRELEASE| 
      STGM_READWRITE|STGM_TRANSACTED|STGM_SHARE_EXCLUSIVE|STGM_CREATE, 
      0, &lpStorage); 
     if (sc != S_OK) 
      return FALSE; 

     ASSERT(lpStorage != NULL); 
     m_lpRootStg = lpStorage; 
    } 

    return TRUE; 
} 

dans OLEDOC1.CPP (partie des bibliothèques MFC). Plus précisément, la ligne de macro RELEASE (m_lpRootStg). Avant d'exécuter cette ligne, en essayant de déplacer ou de supprimer le document, le système d'exploitation indique que le fichier est en cours d'utilisation. Après cette ligne, le fichier est fermé et peut être déplacé.

Je voudrais sous-classer cette méthode pour expérimenter d'autres façons de fermer le fichier. Mais, je ne trouve nulle part la définition de la macro RELEASE. Le plus proche je suis venu était du code d'IBM. Où est définie cette macro? Quelle est la définition?

Répondre

1

Il est dans oleimpl2.h dans le répertoire MFC ... src

#ifndef _DEBUG 
// generate smaller code in release build 
#define RELEASE(lpUnk) _AfxRelease((LPUNKNOWN*)&lpUnk) 
#else 
// generate larger but typesafe code in debug build 
#define RELEASE(lpUnk) do \ 
    { if ((lpUnk) != NULL) { (lpUnk)->Release(); (lpUnk) = NULL; } } while (0) 
#endif 
+0

Merci! Quand j'ai cliqué avec le bouton droit sur la macro pour aller à la définition, cela m'a ramené au code de mon application. Pour une raison quelconque, je l'ai manqué dans la sortie FINDSTR. –