Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164

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

14.06.2016, 14:45. Показов 1825. Ответов 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), чтобы он его нашел внутри. Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.06.2016, 14:45
Ответы с готовыми решениями:

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

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

Interface выдает ошибку
interface MouseMotionListener { void mouseDragged(MouseEvent e); void mouseMoved(MouseEvent e); } Почему здесь выдает...

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

Добавлено через 11 секунд
vxg,
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
15.06.2016, 20:45
igor_petrov, я не знаю что у вас возвращает GetOwner, но думаю нет, он должен возвращать указатель на себя приведённый к указателю на запрашиваемый интерфейс если конечно он его реализует
0
 Аватар для igor_petrov
18 / 8 / 4
Регистрация: 26.01.2014
Сообщений: 164
16.06.2016, 03:02  [ТС]
Лучший ответ Сообщение было отмечено 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2016, 03:02
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru