2017-04-05 114 views
0

我公司的主要應用程序使用OLE文檔。該程序定期且不可預測地關閉其模板文檔不當。所以在打開時看起來隨機的時候,操作系統會拋出STG_E_SHAREVIOLATIONRELEASE C++宏定義

我認爲這個問題可能是我們在用戶退出應用程序或從菜單中選擇File/Close時關閉文件的方式。經過大量的調試/追蹤,它歸結爲OLEDOC1.CPP(MFC庫的一部分)中的

///////////////////////////////////////////////////////////////////////////// 
// '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; 
} 

。特別是RELEASE(m_lpRootStg)宏行。在執行此行之前,嘗試移動或刪除文檔會導致操作系統說文件正在使用中。在這一行之後,文件被關閉並且能夠被移動。

我想這個方法的子類來試驗關閉文件的替代方法。但是,我無法在任何地方找到RELEASE宏的定義。我最近來的是IBM的一些代碼。這個宏定義在哪裏?定義是什麼?

回答

1

這是在MFC src目錄oleimpl2.h ...

#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

謝謝!當我右鍵單擊宏以進入定義時,它將我帶回到我的應用程序自己的代碼中。出於某種原因,我在FINDSTR輸出中錯過了它。 –