【问题标题】:RELEASE C++ Macro DefinitionRELEASE C++ 宏定义
【发布时间】:2017-04-05 15:17:35
【问题描述】:

我公司的主要应用程序使用 OLE 文档。程序会定期且不可预测地不正确地关闭其模板文档。因此,当它们被打开时,操作系统会在看似随机的时间抛出 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;
}

在 OLEDOC1.CPP(MFC 库的一部分)中。特别是 RELEASE(m_lpRootStg) 宏行。在执行此行之前,尝试移动或删除文档会导致操作系统说该文件正在使用中。在这一行之后,文件被关闭并且可以被移动。

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

【问题讨论】:

    标签: c++ macros mfc release ole


    【解决方案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
    

    【讨论】:

    • 谢谢!当我右键单击宏以转到定义时,它带我回到我的应用程序自己的代码。由于某种原因,我在 FINDSTR 输出中错过了它。
    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 2012-05-12
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多