Нужно, чтоб COM объект FilterGraph, входящего в DirectShow, прочитал ранее сохраненный в файле граф. Как я понимаю, это можно сделать с помощью интерфейса IPersistStream. Но для этого нужно связать с интерфейсом IStream c файлом.
Попытался написать следующий код:
IStorage *pStorage = NULL;
IStream *pStream = NULL;
IPersistStream *pPersistStream = NULL;
const WCHAR wszStreamName[] = L"SaveComObject";
HRESULT hr = S_OK;
if (m_pGraphBuilder == NULL) // IGraphBuilder *m_pGraphBuilder
{
hr = E_NOINTERFACE;
}
if (SUCCEEDED(hr))
{
hr = StgOpenStorage(pszFileName, NULL,
STGM_READ | STGM_DIRECT_SWMR | STGM_SHARE_EXCLUSIVE, NULL, NULL, &pStorage);
}
if (SUCCEEDED(hr))
{
hr = pStorage->CreateStream(wszStreamName, STGM_READ | STGM_SHARE_EXCLUSIVE, NULL, NULL, &pStream);
}
...
В строке, написанной жирным шрифтом, возникает ошибка: "Отказано в доступе"
Подскажите, в чем ошибка.
Заранее благодарен
Проект пишется MSVS 2015 C++, WINAPI и stl
Здравствуйте, Melamed, Вы писали:
M>В строке, написанной жирным шрифтом, возникает ошибка: "Отказано в доступе"
M>Подскажите, в чем ошибка.
M>Заранее благодарен
M>Проект пишется MSVS 2015 C++, WINAPI и stl
Вот этот пример тоже не
работает?
Здравствуйте, Videoman, Вы писали:
Высылаю работающий вариант
RESULT CDirectShowBase::ReadGraphFromFile(LPCTSTR pszFileName)
{
IStorage *pStorage = NULL;
IStream *pStream = NULL;
IPersistStream *pPersistStream = NULL;
IEnumSTATSTG *pEnumSTASTG = NULL;
STATSTG statStg;
ZeroMemory(&statStg, sizeof(STATSTG));
HRESULT hr = S_OK;
ULONG ulCount;
if (m_pGraphBuilder == NULL) // IGraphBuilder *m_pGraphBuilder;
{
hr = E_NOINTERFACE;
}
if (SUCCEEDED(hr))
{
hr = StgIsStorageFile(pszFileName);
}
if (SUCCEEDED(hr))
{
hr = StgOpenStorage(pszFileName, NULL,
STGM_READWRITE | STGM_DIRECT_SWMR | STGM_SHARE_EXCLUSIVE, NULL, NULL, &pStorage);
}
if (SUCCEEDED(hr))
{
hr = pStorage->EnumElements(0, NULL, 0, &pEnumSTASTG);
};
if (SUCCEEDED(hr))
{
hr = pEnumSTASTG->Next(1, &statStg, &ulCount);
}
if (hr == S_OK)
{
hr = pStorage->OpenStream(statStg.pwcsName,NULL,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,0,&pStream);
CoTaskMemFree(statStg.pwcsName);
}
else
{
hr = E_FAIL;
}
if (SUCCEEDED(hr))
{
hr = m_pGraphBuilder->QueryInterface(IID_IPersistStream, (void**)&pPersistStream);
}
if (SUCCEEDED(hr))
{
hr = pPersistStream->Load(pStream);
}
SAFERELEASE(pPersistStream);
SAFERELEASE(pStream);
SAFERELEASE(pStorage);
return hr;
}
V>Здравствуйте, Melamed, Вы писали:
M>>В строке, написанной жирным шрифтом, возникает ошибка: "Отказано в доступе"
M>>Подскажите, в чем ошибка.
M>>Заранее благодарен
M>>Проект пишется MSVS 2015 C++, WINAPI и stl
V>Вот этот пример тоже не работает?