Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > C/C++: Системное программирование и WinAPI > Использование DLL (COM-объект) без регистрации |
Автор: Lun2 28.05.22, 18:28 |
Ддобрый вечер! Я хочу подключить фильтр к графу DirectShow без регистрации DLL, в которой реализован фильтр (COM-объект). Прочитал статью, в которой предлагается способ. код приведен ниже - последние строки собственно и подключают фильтр к графу Может мне кто-нибудь объяснить как работает строка (внизу): IBaseFilterPtr pFilter = pUnk ? Насколько я понимаю pUnk - это указатель на IKnown, т.е. тип не соответствует типу pFilter. Когда пробовал у себя провернуть то же самое, использовал IBaseFilter* pFilter = (IBaseFilter*) pUnk, то AddFilter "вылетал" с ошибкой - из чего я делаю вывод, что мое приведение типов некорректно. Мой вопрос: каким образом получить из pUnk корректный указатель на фильтр, чтобы добавить его к графу ? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> // 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); } |
Автор: B.V. 28.05.22, 19:16 |
QueryInterface? |
Автор: Lun2 28.05.22, 20:21 |
B.V., спасибо за подсказку! |