2016-09-13 4 views
3

Ich benutze Filter DS LAME zum Komprimieren von Audio. Ich lud sie aus der Datei "lame.ax" wie folgt:Wie Verwenden von Eigenschaftenseiten auf nicht registriertem Filter?

// pPath - path to LAME "lame.ax" 
HRESULT CMyFilter::CreateObjectFromPath(wchar_t *pPath, REFCLSID clsid, IUnknown **ppUnk) 
{ 
    // load the target DLL directly 
    if (!m_hLibFilter) m_hLibFilter = LoadLibrary(pPath); 
    if (!m_hLibFilter) 
    { 
     return HRESULT_FROM_WIN32(GetLastError()); 
    } 

    // the entry point is an exported function 
    FN_DLLGETCLASSOBJECT fn = (FN_DLLGETCLASSOBJECT)GetProcAddress(m_hLibFilter, "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; 
} 

weiter

HRESULT hr = 0; 
IUnknown *ppUnk = 0; 
ULONG lRef = 0;  
hr = CreateObjectFromPath(L"lame.ax", CLSID_LAMEDShowFilter, (IUnknown **)&ppUnk); 
hr = ppUnk->QueryInterface(&m_pFilter); 
lRef = ppUnk->Release(); 

Es funktioniert perfekt. LAME-Kodierung von Audio.

ich die Filtereinstellungen anzeigen möchten - Eigenschaftenseite, aber dieser Code ist fehlgeschlagen

bool ShowConfigWindow(HWND hParent) 
{ 
    ISpecifyPropertyPages *pProp; 
    HRESULT hr = m_pFilter->QueryInterface(IID_ISpecifyPropertyPages, (void **)&pProp); 
    if (SUCCEEDED(hr)) 
    { 
     // Get the filter's name and IUnknown pointer. 
     FILTER_INFO FilterInfo; 
     hr = m_pFilter->QueryFilterInfo(&FilterInfo); 
     IUnknown *pFilterUnk; 
     m_pFilter->QueryInterface(IID_IUnknown, (void **)&pFilterUnk); 

     // Show the page. 
     CAUUID caGUID; 
     pProp->GetPages(&caGUID); 
     pProp->Release(); 
     HRESULT hr = OleCreatePropertyFrame(
      hParent,     // Parent window 
      0, 0,     // Reserved 
      FilterInfo.achName,  // Caption for the dialog box 
      1,      // Number of objects (just the filter) 
      &pFilterUnk,   // Array of object pointers. 
      caGUID.cElems,   // Number of property pages 
      caGUID.pElems,   // Array of property page CLSIDs 
      0,      // Locale identifier 
      0, NULL     // Reserved 
     ); 

     // Clean up. 
     pFilterUnk->Release(); 
     FilterInfo.pGraph->Release(); 
     CoTaskMemFree(caGUID.pElems); 
    } 
    return true; 
} 

I https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.directx.video/jknSbMenWeM finden

I CoRegisterClassObject für jede Eigenschaft Seite aufrufen sollte, aber wie es zu tun? Oder was ist der richtige Weg?

Antwort

3

OleCreatePropertyFrame nimmt die Eigenschaftenseiten-Klassenbezeichner (CLSIDs), sodass Sie einen Weg finden müssen, um sie für die API "sichtbar" zu machen.

Die Verwendung von CoRegisterClassObject ist eine der Möglichkeiten, die erwähnte Aufgabe zu erreichen (vielleicht die einfachste, eine andere Methode wäre reg-free COM). Sie müssen IClassFactory Zeiger für CLSIDs der Eigenschaftenseite auf dieselbe Weise abrufen wie im ersten Snippet. Dann verwenden Sie anstelle von IClassFactory::CreateInstance die Schnittstellenzeiger als Argumente für CoRegisterClassObject API. Stellen Sie sicher, dass Sie es im selben Thread wie der folgende OleCreatePropertyFrame Aufruf tun. CoRevokeClassObject wird danach alles sauber machen.

+0

Roman, danke. Es funktionierte. –

Verwandte Themen