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

时间:2011-05-31 22:01:20

标签: c++ windows com

由于我需要使用MSXML格式化“漂亮”的XML,我使用trick referenced here为我的代码添加缩进。由于我只想保存文件,因此我使用IStream打开SHCreateStreamOnFile()。文件被保存,我可以在文本编辑器中打开它,XML内容就在那里。然后我在Release()界面上调用IStream,以便IStream和文件句柄关闭。

或者我应该这样做,但是Process Explorer告诉我,一旦我的保存功能退出(尽管发布),我的进程仍然会引用我的文件。我尝试第二次调用Release(),但仍然没有结果,句柄没有关闭。所有Google和MSDN都可以告诉我,我应该调用Release ...但不清楚Release()是否只释放COM对象或文件句柄。

那么,是否有一种特殊方法可以强制关闭由SHCreateStreamOnFile()创建的文件句柄?或者有更好的方法来获取文件上的IStream吗?我是否需要按特定顺序致电Release()IMXWriterISAXXMLReader上的IStream

提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

来自不习惯COM编程的人的初学者错误。

答案 1 :(得分:0)

我之前遇到过这个问题:

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()的析构函数执行; ,文件句柄将被关闭。