如何关闭用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()的析构函数上等待执行。 ,文件上的句柄将关闭。