由于我需要使用MSXML格式化“漂亮”的XML,我使用trick referenced here为我的代码添加缩进。由于我只想保存文件,因此我使用IStream
打开SHCreateStreamOnFile()
。文件被保存,我可以在文本编辑器中打开它,XML内容就在那里。然后我在Release()
界面上调用IStream
,以便IStream
和文件句柄关闭。
或者我应该这样做,但是Process Explorer告诉我,一旦我的保存功能退出(尽管发布),我的进程仍然会引用我的文件。我尝试第二次调用Release()
,但仍然没有结果,句柄没有关闭。所有Google和MSDN都可以告诉我,我应该调用Release
...但不清楚Release()
是否只释放COM对象或文件句柄。
那么,是否有一种特殊方法可以强制关闭由SHCreateStreamOnFile()
创建的文件句柄?或者有更好的方法来获取文件上的IStream
吗?我是否需要按特定顺序致电Release()
,IMXWriter
和ISAXXMLReader
上的IStream
?
提前谢谢。
答案 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()的析构函数执行; ,文件句柄将被关闭。