2014-01-22 31 views
1

我正在編寫如MSDN教程中所示的自定義轉換篩選器: http://msdn.microsoft.com/en-us/library/windows/desktop/dd391015%28v=vs.85%29.aspx項目C++中的DirectShow自定義篩選器

它與我的主要的DirectShow謨寫的(我不是做與過濾器一個DLL)

的問題是我不知道如何創建/使用的過濾器。我曾嘗試CoCreateInstance的

SmartPtr<IFilterRotation> _pRotation = 0; // My custom filter 
if(!SUCCEEDED(_mResult = CoCreateInstance(CLSID_FilterRotation, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&_pRotation))) 
{ 
     return _mResult; 
} 

但它返回以下錯誤:REGDB_E_CLASSNOTREG

這裏是我的全部覆蓋的元素的時刻:

#pragma once 

// {4A80F8B5-CFB0-4dc6-96C5-DA427B6DB8BD} 
DEFINE_GUID(CLSID_FiltreRotation, 
0x4a80f8b5, 0xcfb0, 0x4dc6, 0x96, 0xc5, 0xda, 0x42, 0x7b, 0x6d, 0xb8, 0xbd); 


    class IFilterRotation: public CTransformFilter 
    { 
    public: 
     IFilterRotation(void); 
     ~IFilterRotation(void); 

    HRESULT IFilterRotation::CheckInputType(const CMediaType *vpMediaTypeIn); 
    HRESULT IFilterRotation::CheckTransform(const CMediaType *vpMediaTypeIn, 
              const CMediaType *vpMediaTypeOut); 
    HRESULT IFilterRotation::DecideBufferSize(IMemAllocator *vpAllocation, 
               ALLOCATOR_PROPERTIES *vppRequeteProprieteIn); 
    HRESULT IFilterRotation::GetMediaType(int vPosition, 
              CMediaType *vpMediaType); 
    HRESULT IFilterRotation::Transform(IMediaSample *vpMediaSampleIn, 
             IMediaSample *vpMediaSampleOut); 

    }; 

我這麼想嗎? 在此先感謝。

回答

1

的邏輯鏈條在這裏如下:

  • CoCreateInstance需要CLSID_Xxx
  • CLSID_Xxx不僅需要來定義,但也應適當地項目
    • ...這意味着服務你應該有一個CFactoryTemplate實例將CLSID映射到你的類

有關詳細信息,請參閱Windows SDK示例之一,我特別推薦EZRGB24

您只顯示您在項目中定義了CLSID。 IFilterRotation類對我來說看起來不太好(你通常不會從C類繼承我的東西,但它是一個命名問題)。你不顯示你是否有CFactoryTemplate,我想你沒有。

但是,當您將過濾器放入DLL時,這一切都是真實的。在你的情況下,你根本沒有註冊COM類,所以CoCreateInstance不適合你。您的選項要麼將該類放入DLL中,要麼將該類用於CoCreateInstance,或創建該類的簡單C++實例(運算符new或堆棧/靜態實例),然後直接傳遞給AddFilter

+0

我以爲CFactoryTemplate只能在DLL中使用,所以這就是爲什麼我沒有實現它。我會去看看樣品。我認爲這正是我需要清楚地瞭解自定義轉換過濾器的工作原理。是的,我的班級名稱對於我目前正在做的事情是錯誤的:/。 –

+1

當你使用AddFilter過濾器時,它不是一個COM接口指針,但它不必具有完整的COM註冊和完整的DirectShow註冊。相反,'CoCreateInstance'假設你有這個COM類的COM註冊。 –

+0

感謝您的幫助。不幸的是,當我運行程序時,我有一個錯誤。 (sdkpath)\ baseclasses \ wxdebug.cpp的第892行的[szObjectName^!! wszObjectName繼續? (取消調試)[按鈕]是,不,取消。你有什麼想法是什麼?在wxdebug.cpp中,它鏈接到函數DbgRegisterObjectCreation,所以它看起來像是一個註冊(概率COM?)問題。 –

1

IFilterRotation應該具有私有構造函數和析構函數,因爲它是一個COM對象(您希望阻止在堆棧上創建實例,或者通過調用new,因爲引用計數..要防止通過調用delete來銷燬此類對象以及)。一旦參考計數下降到零,它將自行銷燬。 添加用於創建IFilterRotation實例的靜態方法。

static IFilterRotation * createInstance() 
{ 
    IFilterRotation * const pFilterRotation(new (std::nothrow) IFilterRotation()); 

    if(pFilterRotation) 
     pFilterRotation->AddRef(); 

    return pFilterRotation; 
} 

只有將過濾器作爲單獨的DLL使用時,纔可以使用CoCreateInstance()。當然,你也必須在使用CoCreateInstance()之前註冊這樣的DLL。