如何解决如何关闭用SHCreateStreamOnFile打开的文件句柄
| 因为我需要使用MSXML格式化\“ pretty \” XML,所以我使用此处引用的技巧将缩进添加到代码中。因为我只想保存文件,所以我用SHCreateStreamOnFile()
打开an0ѭ。文件被保存,我可以在文本编辑器中打开它,并且XML内容在那里。然后我在IStream
接口上调用Release()
,以使IStream
和文件句柄关闭。
大概我还是坚强的,但是Process Explorer告诉我,一旦我的保存功能退出(尽管发布了),我的进程仍然对我的文件有引用。我尝试第二次调用Release()
,但仍然没有结果,句柄没有关闭。 Google和MSDN只能告诉我应该叫ѭ6...,但是尚不清楚Release()
是否仅释放COM对象或文件句柄。
因此,是否有一种特殊的方法来强制关闭由SHCreateStreamOnFile()
创建的文件句柄?还是有更好的方法在文件上获取“ 0”?我是否需要按特定顺序调用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()的析构函数上等待执行。 ,文件上的句柄将关闭。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。