Форум программистов, компьютерный форум CyberForum.ru

C++: COM, OLE, ActiveX

Войти
Регистрация
Восстановить пароль
 
igor_petrov
18 / 8 / 3
Регистрация: 26.01.2014
Сообщений: 164
#1

Фильтр DirectShow. Query Interface выдает E_NOINTERFACE - C++ COM

14.06.2016, 14:45. Просмотров 537. Ответов 4
Метки нет (Все метки)

В общем, ситуация следующая: есть самописный transfer-фильтр DirectShow, который успешно регистрируется в системе и с помощью которого удачно строится граф.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
DEFINE_GUID(CLSID_GPUTextureFilter, 0x2899ced4, 0x9428, 0x481b, 0xb8, 0x8e, 0x95, 0x98, 0x6b, 0x65, 0x3b, 0x77);
 
class GPUTextureFilter : public CTransformFilter, public IDummyTransfrm {
public:
    static CUnknown* __stdcall CreateInstance(IUnknown *punk, HRESULT *phr);
 
    HRESULT __stdcall QueryInterface(const IID &riid, void **ppv);  
    ULONG __stdcall AddRef();
    ULONG __stdcall Release();
 
    HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut);
    HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
    HRESULT CheckTransform(const CMediaType *pInputType, const CMediaType *pOutputType);
    HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProperties);
 
    void __stdcall SetSRVPointer(ID3D11ShaderResourceView *pD3DSRV);
    void __stdcall SetTexture2DPointer(ID3D11Texture2D *pD3DT2d);
    ID3D11ShaderResourceView* __stdcall GetSRVPointer() const;
    ID3D11Texture2D* __stdcall Texture2DPointer() const;
 
private:
    GPUTextureFilter(WCHAR *tszName, LPUNKNOWN pUnknown, HRESULT *pHR);
    ~GPUTextureFilter();
 
    HRESULT CheckInputType(const CMediaType *pInputType);
    HRESULT Copy(IMediaSample *pSource, IMediaSample *pDest) const;
};
Следующий код отрабатывает нормально.
C++
1
2
IBaseFilter *pDummyTransfrm;
hr = CoCreateInstance(CLSID_GPUTextureFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pDummyTransfrm);
Но мне нужно получить из класса с помощью функции QueryInterface указатель на интерфейс IDummyTransfrm, который объявлен вот так:
C++
1
2
3
4
5
6
7
8
9
10
static const IID IID_DummyTransform = {0xb111881a, 0x0e0b, 0x4f18, 0x8d, 0x0b, 0xb6, 0xb6, 0x67, 0x27, 0xf1, 0xff};
 
struct __declspec(uuid("b111881a-0e0b-4f18-8d0b-b6b66727f1ff"))
    IDummyTransfrm : IUnknown
{
    virtual void __stdcall SetSRVPointer(ID3D11ShaderResourceView *pD3DSRV) = 0;
    virtual void __stdcall SetTexture2DPointer(ID3D11Texture2D *pD3DT2d) = 0;
    virtual ID3D11ShaderResourceView* __stdcall GetSRVPointer() const = 0;
    virtual ID3D11Texture2D* __stdcall Texture2DPointer() const = 0;
};
При вызове следующего кода, как бы я не пытался, всегда выдает E_NOINTERFACE.
C++
1
2
IDummyTransfrm *pIDummyTransfrm;
hr = pDummyTransfrm->QueryInterface(IID_DummyTransform, (void**)&pIDummyTransfrm);
Вопрос к экспертам, как правильно их объявить (подозреваю ошибку в GUID/IID), чтобы он его нашел внутри. Спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2016, 14:45     Фильтр DirectShow. Query Interface выдает E_NOINTERFACE
Посмотрите здесь:
E_NOINTERFACE COM C++ COM
RTSP и DirectShow C++ COM
C++ COM DirectShow + Adobe Flash Player PPAPI
C++ COM DirectShow, проиграть видео в своем окне?
IDispatch interface ADODB C++ COM
Form as a interface for a Query MS Access
Удаление записей через DBGrid. Выдает ошибку - Query CommandText does not return a result set Delphi БД
Matlab Цифровой фильтр. Программа работает когда запускаешь в .m файле, а с .fig выдает ошибку
Shodanhq - ошибка Error: Invalid search query, please check the query syntax
Не работает $db->query(); // Call to a member function Query() on a non-object in PHP
PHP БД Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in
DirectShow C++ Builder

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3116 / 1918 / 208
Регистрация: 13.01.2012
Сообщений: 7,342
14.06.2016, 15:26     Фильтр DirectShow. Query Interface выдает E_NOINTERFACE #2
igor_petrov, наверное вы имели ввиду
C++
1
2
3
4
IBaseFilter *pIBaseFilter;
hr = CoCreateInstance(CLSID_GPUTextureFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pIBaseFilter);
IDummyTransfrm *pIDummyTransfrm;
hr = pIBaseFilter->QueryInterface(IID_DummyTransform, (void**)&pIDummyTransfrm);
вопрос: объект CLSID_GPUTextureFilter может отдать IID_DummyTransform?

Добавлено через 1 минуту
...имею ввиду - что у вас в GPUTextureFilter::QueryInterface
igor_petrov
18 / 8 / 3
Регистрация: 26.01.2014
Сообщений: 164
15.06.2016, 19:59  [ТС]     Фильтр DirectShow. Query Interface выдает E_NOINTERFACE #3
Да, все правильно, это и имел в виду. Может дело в том, что нужно перегрузить QueryInterface? Я думал он должен быть таким:
C++
1
2
3
HRESULT __stdcall GPUTextureFilter::QueryInterface(const IID &riid, void **ppv) {
    return GetOwner()->QueryInterface(riid, ppv);
}
?

Добавлено через 11 секунд
vxg,
vxg
Модератор
3116 / 1918 / 208
Регистрация: 13.01.2012
Сообщений: 7,342
15.06.2016, 20:45     Фильтр DirectShow. Query Interface выдает E_NOINTERFACE #4
igor_petrov, я не знаю что у вас возвращает GetOwner, но думаю нет, он должен возвращать указатель на себя приведённый к указателю на запрашиваемый интерфейс если конечно он его реализует
igor_petrov
18 / 8 / 3
Регистрация: 26.01.2014
Сообщений: 164
16.06.2016, 03:02  [ТС]     Фильтр DirectShow. Query Interface выдает E_NOINTERFACE #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Фууух, разобрался. Нужно было правильно перегрузить виртуальные методы IUnknown внутри моего класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*Внутри моего класса*
 
<...>
 
//Реализация IUnknown
HRESULT __stdcall QueryInterface(const IID &riid, void **ppv) {
    if(riid == IID_IBaseFilter) {
        return GetInterface((IBaseFilter*)this, ppv);
    } else if(riid == IID_MyInterface) {
        return GetInterface((IMyInterface*)this, ppv); //Указатель на мой интерфейс
    } else {
        *ppv = nullptr;
        return E_NOINTERFACE;
    }
}
 
ULONG __stdcall AddRef() {return InterlockedIncrement(&m_cRef);}
ULONG __stdcall Release() {ULONG cRef = InterlockedDecrement(&m_cRef); if(cRef == 0) {delete this;} return cRef;}
 
<...>
Спасибо большое за помощь!
Yandex
Объявления
16.06.2016, 03:02     Фильтр DirectShow. Query Interface выдает E_NOINTERFACE
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru