如何closures使用SHCreateStreamOnFile打开的文件句柄

由于我需要使用MSXML格式化“漂亮”的XML,我使用这里引用的技巧来添加缩进到我的代码。 由于我只想保存一个文件,我使用SHCreateStreamOnFile()打开一个IStream 。 文件被保存,我可以在文本编辑器中打开它,XML内容在那里。 然后,我在IStream接口上调用Release() ,以便closuresIStream和文件句柄。

或者我想,但是Process Explorer告诉我,一旦我的保存函数退出(尽pipe释放),我的过程仍然有一个对我的文件的引用。 我第二次尝试调用Release() ,但仍然没有结果,句柄没有closures。 所有Google和MSDN都可以告诉我,我应该调用Release …但是, Release()只释放COM对象或文件句柄还不清楚。

那么,是否有一种特殊的方法来强制closures由SHCreateStreamOnFile()创build的文件句柄? 还是有更好的方式来获得文件上的IStream ? 我是否需要按照特定顺序在IMXWriterISAXXMLReaderIStream上调用Release()

先谢谢你。

ildjarn是正确的,我把它传递给一个没有被删除的对象,因为我不知道QueryInterface递增引用计数(我认为这是一种“COM”投掷指针的方式)。 释放该对象的同时释放该文件。

一个不习惯COM编程的人的初学者错误。

我之前遇到过这个问题:

 CComPtr<IStream> spStream; HRESULT hr = SHCreateStreamOnFileEx(L"my.xml", STGM_READWRITE | STGM_SHARE_DENY_WRITE | STGM_FAILIFTHERE, FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_HIDDEN, TRUE, NULL, &spStream); SOMSXML::IXMLDOMDocumentPtr pXMLDoc; hr = pXMLDoc.CreateInstance(__uuidof(SOMSXML::DOMDocument)); pXMLDoc->async = false; hr = pXMLDoc->load(spStream.p); 

您必须等待pXMLDoc和spStream.Release()的析构函数执行。 ,文件上的句柄将被关闭。