Прочитать DirectShow графа Com объектом FilterGraph
От: Melamed Россия  
Дата: 30.07.22 18:18
Оценка:
Нужно, чтоб 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
Re: Прочитать DirectShow графа Com объектом FilterGraph
От: Videoman Россия https://hts.tv/
Дата: 31.07.22 10:36
Оценка:
Здравствуйте, Melamed, Вы писали:

M>В строке, написанной жирным шрифтом, возникает ошибка: "Отказано в доступе"

M>Подскажите, в чем ошибка.
M>Заранее благодарен
M>Проект пишется MSVS 2015 C++, WINAPI и stl

Вот этот пример тоже не работает?
Re[2]: Прочитать DirectShow графа Com объектом FilterGraph
От: Melamed Россия  
Дата: 31.07.22 12:15
Оценка:
Здравствуйте, 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>Вот этот пример тоже не работает?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.