由于我需要使用MSXML格式化“漂亮”的XML,我使用这里引用的技巧来添加缩进到我的代码。 由于我只想保存一个文件,我使用SHCreateStreamOnFile()
打开一个IStream
。 文件被保存,我可以在文本编辑器中打开它,XML内容在那里。 然后,我在IStream
接口上调用Release()
,以便closuresIStream
和文件句柄。
或者我想,但是Process Explorer告诉我,一旦我的保存函数退出(尽pipe释放),我的过程仍然有一个对我的文件的引用。 我第二次尝试调用Release()
,但仍然没有结果,句柄没有closures。 所有Google和MSDN都可以告诉我,我应该调用Release
…但是, Release()
只释放COM对象或文件句柄还不清楚。
那么,是否有一种特殊的方法来强制closures由SHCreateStreamOnFile()
创build的文件句柄? 还是有更好的方式来获得文件上的IStream
? 我是否需要按照特定顺序在IMXWriter
, ISAXXMLReader
和IStream
上调用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()的析构函数执行。 ,文件上的句柄将被关闭。