发布 C++ 宏定义

RELEASE C++ Macro Definition

我公司的主要应用程序使用 OLE 文档。该程序会定期且不可预测地不正确地关闭其模板文档。因此,在打开它们时看似随机的时间,OS 会抛出 STG_E_SHAREVIOLATION

我认为问题可能出在当用户退出应用程序或从菜单中选择文件/关闭时我们关闭文件的方式。经过大量调试/跟踪后,归结为

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

in OLEDOC1.CPP(MFC 库的一部分)。特别是 RELEASE(m_lpRootStg) 宏行。在执行此行之前,尝试移动或删除文档会导致 OS 表明该文件正在使用中。在此行之后,文件将关闭并可以移动。

我想将此方法子类化以试验关闭文件的其他方法。但是,我无法在任何地方找到 RELEASE 宏的定义。我最接近的是来自 IBM 的一些代码。这个宏在哪里定义的?定义是什么?

在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