2016-09-13 13 views
3

오디오 압축에 DS LAME 필터를 사용합니다. 그것은 완벽하게 작동등록되지 않은 필터에서 등록 정보 페이지를 사용하는 방법은 무엇입니까?

// 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; 
} 

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(); 

다음과 같이 나는 파일 "lame.ax"에서로드. LAME 인코딩 오디오.

내가 필터 설정을 보여주고 싶은 - 속성 페이지,하지만이 코드는

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; 
} 

내가

나는 각 속성 페이지를 CoRegisterClassObject를 호출해야 https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.directx.video/jknSbMenWeM을 찾을 실패,하지만 어떻게 그것을 할? 또는 올바른 방법은 무엇입니까?

답변

3

OleCreatePropertyFrame은 속성 페이지 클래스 식별자 (CLSID)를 사용하므로 API에서 해당 속성을 표시 할 수있는 방법을 찾아야합니다.

CoRegisterClassObject의 사용은 언급 된 작업을 달성하는 방법 중 하나입니다 (가장 쉬운 방법은 다른 방법은 reg-free COM입니다). 속성 페이지 CLSID의 첫 번째 코드에서와 같은 방법으로 IClassFactory 포인터를 검색해야합니다. 그런 다음 IClassFactory::CreateInstance을 호출하는 대신 CoRegisterClassObject API의 인수로 인터페이스 포인터를 사용합니다. 다음 스레드와 동일한 스레드에서 수행해야합니다. OleCreatePropertyFrame 호출. CoRevokeClassObject 나중에 정리할 것입니다.

+0

로마인, 감사합니다. 그것은 효과가 있었다. –