Как закрыть дескриптор файла, открытый с SHCreateStreamOnFile - PullRequest
2 голосов
/ 01 июня 2011

Поскольку мне нужно отформатировать «симпатичный» XML с использованием MSXML, я использую трюк , на который здесь ссылаются , чтобы добавить отступы в мой код. Поскольку все, что я хочу - это сохранить файл, я открываю IStream, используя SHCreateStreamOnFile(). Файл будет сохранен, я могу открыть его в текстовом редакторе, и там есть содержимое XML. Затем я вызываю Release() на интерфейсе IStream, чтобы IStream и дескриптор файла закрылись.

Или я так и думал, однако Process Explorer говорит мне, что мой процесс все еще имеет ссылку на мой файл после выхода из функции сохранения (несмотря на выпуск). Я попытался вызвать Release() во второй раз, но все равно ничего не получилось, ручка не закрылась. Все, что Google и MSDN могли сказать мне, это то, что я должен позвонить Release ... Но не ясно, если Release() освободит только COM-объект или дескриптор файла.

Итак, существует ли особый способ принудительного закрытия дескриптора файла, созданного SHCreateStreamOnFile()? Или есть лучший способ получить IStream на файл? Нужно ли звонить Release() на номера IMXWriter, ISAXXMLReader и IStream в определенном порядке?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

ildjarn был прав, я передавал его объекту, который не был удален, потому что я не знал, что QueryInterface увеличивает счетчик ссылок (я думал, что это был своего рода «COM» способ приведения указателя) , При освобождении этого объекта файл был выпущен одновременно.

Ошибка новичка от того, кто не привык к COM-программированию.

0 голосов
/ 29 марта 2013

Я сталкивался с этой проблемой раньше:

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 ();, дескриптор файла будет закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...