Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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., спасибо за подсказку!

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)