18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
1

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

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

Author24 — интернет-сервис помощи студентам
В общем, ситуация следующая: есть самописный 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), чтобы он его нашел внутри. Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2016, 14:45
Ответы с готовыми решениями:

Form as a interface for a Query
хочу сделать форму с полями, введённые значения в которых используются в качестве параметров для...

DirectShow как добавить фильтр?
Есть замечательная статья про DirectShow в C#. Там же есть исходники и скомпилированные примеры....

Interface выдает ошибку
interface MouseMotionListener { void mouseDragged(MouseEvent e); void mouseMoved(MouseEvent...

E_NOINTERFACE COM
Добрый день. Взял пример кода из книги Д. Роджерсона. Его скомпилированный вариант работает на ура,...

4
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
14.06.2016, 15:26 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
0
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
15.06.2016, 19:59  [ТС] 3
Да, все правильно, это и имел в виду. Может дело в том, что нужно перегрузить QueryInterface? Я думал он должен быть таким:
C++
1
2
3
HRESULT __stdcall GPUTextureFilter::QueryInterface(const IID &riid, void **ppv) {
    return GetOwner()->QueryInterface(riid, ppv);
}
?

Добавлено через 11 секунд
vxg,
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
15.06.2016, 20:45 4
igor_petrov, я не знаю что у вас возвращает GetOwner, но думаю нет, он должен возвращать указатель на себя приведённый к указателю на запрашиваемый интерфейс если конечно он его реализует
0
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
16.06.2016, 03:02  [ТС] 5
Лучший ответ Сообщение было отмечено vxg как решение

Решение

Фууух, разобрался. Нужно было правильно перегрузить виртуальные методы 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;}
 
<...>
Спасибо большое за помощь!
0
16.06.2016, 03:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2016, 03:02
Помогаю со студенческими работами здесь

Удаление записей через DBGrid. Выдает ошибку - Query CommandText does not return a result set
Таблица подключена, запрос delete * from Списание where Причина_списания = :поломка При включении...

Shodanhq - ошибка Error: Invalid search query, please check the query syntax
Собственно, такая проблема. Я думаю, что многие знакомы с такой поисковой системой, как...

Не работает $db->query(); // Call to a member function Query() on a non-object in
Только приступил к ООП, поэтому очевидно наличие простых ошибок. Вот код, который при запуске...

Расширенный фильтр выдает неверный результат. Не могу найти ошибку
Здравствуйте. Помогите решить задание: Найти информацию о студентах в возрасте от Возраст1 до...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru