Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.195.47.227] |
|
Сообщ.
#1
,
|
|
|
Ддобрый вечер!
Я хочу подключить фильтр к графу DirectShow без регистрации DLL, в которой реализован фильтр (COM-объект). Прочитал статью, в которой предлагается способ. код приведен ниже - последние строки собственно и подключают фильтр к графу Может мне кто-нибудь объяснить как работает строка (внизу): IBaseFilterPtr pFilter = pUnk ? Насколько я понимаю pUnk - это указатель на IKnown, т.е. тип не соответствует типу pFilter. Когда пробовал у себя провернуть то же самое, использовал IBaseFilter* pFilter = (IBaseFilter*) pUnk, то AddFilter "вылетал" с ошибкой - из чего я делаю вывод, что мое приведение типов некорректно. Мой вопрос: каким образом получить из pUnk корректный указатель на фильтр, чтобы добавить его к графу ? // define the prototype of the class factory entry point in a COM dll typedef HRESULT (STDAPICALLTYPE* FN_DLLGETCLASSOBJECT)(REFCLSID clsid, REFIID iid, void** ppv); HRESULT CreateObjectFromPath(TCHAR* pPath, REFCLSID clsid, IUnknown** ppUnk) { // load the target DLL directly HMODULE lib = LoadLibrary(pPath); if (!lib) { return HRESULT_FROM_WIN32(GetLastError()); } // the entry point is an exported function FN_DLLGETCLASSOBJECT fn = (FN_DLLGETCLASSOBJECT)GetProcAddress(lib, "DllGetClassObject"); if (fn == NULL) { return HRESULT_FROM_WIN32(GetLastError()); } // create a class factory IUnknownPtr pUnk; HRESULT hr = fn(clsid, IID_IUnknown, (void**)(IUnknown**)&pUnk); if (SUCCEEDED(hr)) { IClassFactoryPtr pCF = pUnk; if (pCF == NULL) { hr = E_NOINTERFACE; } else { // ask the class factory to create the object hr = pCF->CreateInstance(NULL, IID_IUnknown, (void**)ppUnk); } } return hr; } ................................................... IUnknownPtr pUnk; HRESULT hr = CreateObjectFromPath(TEXT("c:\\path\\to\\myfilter.dll"), IID_MyFilter, &pUnk); if (SUCCEEDED(hr)) { IBaseFilterPtr pFilter = pUnk; pGraph->AddFilter(pFilter, L"Private Filter"); pGraph->RenderFile(pMediaClip, NULL); } |
Сообщ.
#2
,
|
|
|
QueryInterface?
|
Сообщ.
#3
,
|
|
|
B.V., спасибо за подсказку!
|