2016-09-13 21 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 ?私は、各プロパティページ用のCoRegisterClassObjectを呼び出す必要がありますが、それを行う方法をhttps://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.directx.video/jknSbMenWeM

を見つけるプロパティページが、このコードは

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

を失敗しました -

私は、フィルタの設定を表示したい

または、正しい方法は?

答えて

3

OleCreatePropertyFrameは、プロパティページクラス識別子(CLSID)を受け取り、APIで「可視」にする方法を見つける必要があります。

CoRegisterClassObjectの使用は、前述のタスクを達成する方法の1つです(おそらく最も簡単な別の方法はreg-free COMです)。最初のスニペットと同じ方法で、プロパティページCLSIDのポインタIClassFactoryを取得する必要があります。 IClassFactory::CreateInstanceを呼び出す代わりに、CoRegisterClassObject APIの引数としてインターフェイスポインタを使用します。次のOleCreatePropertyFrameコールと同じスレッドで実行してください。 CoRevokeClassObjectは後で物事を清掃します。

+0

ローマ、ありがとう。出来た。 –

関連する問題