【发布时间】: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