为什么它仍然报告没有注册 [英] why it still reports no registered

查看:51
本文介绍了为什么它仍然报告没有注册的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好:

在我印象中,出现在graphedit中的过滤器已被注册.因此我们可以直接使用它.
但这一次我有麻烦.
当我使用coCreateInstace函数在代码中创建特殊过滤器时,我的编译器
报告错误.




它报告没有注册.我必须在我的代码中注册它:


//

hello:

in my impression that filters that appear in graphedit have been registered.so we can use it directly.
but this time i have a touble about it.
when i use coCreateInstace function to create a special filter in my code ,my complier
reports erro.




it reports that no registered. and i have to register it in my code:


//

//{4A69B442-28BE-4991-969C-B500ADF5D8A8} MPEG4s decoder
OUR_GUID_ENTRY(CLSID_MPEG4s_decoder,
               0x4a69e442,0x28be,0x4991, 0x96, 0x9c,0xb5, 0x00, 0xad ,0xf5,0xd8,0xa8);



BOOL pass = FALSE;
if(!IsFilterRegistered(CLSID_MPEG4s_decoder))
通过= RegisterFilter(TEXT("C:\\ Windows \\ System32 \\ MP4SDECD.DLL"));

if(pass)//在此处中断,通过值= true
hr = AddFilterByClSID(pGraph,CLSID_MPEG4s_decoder,
TEXT("MPEG4s Decoder DMO"),& pMPEG4sDecoder);
if(FAILED(hr))//但在这里,hr = 0x80040154
返回FALSE;

HRESULT CPlayer :: AddFilterByClSID(
IFilterGraph * pfG,
const GUID& clsid,
LPCWSTR wszName,
IBaseFilter ** ppf)
{
if(!pfG ||!ppf)
return E_POINTER;
(* ppf)= 0;
IBaseFilter * pF = 0;
HRESULT hr = CoCreateInstance(
clsid,
NULL,
CLSCTX_INPROC,
IID_IBaseFilter,
reinterpret_cast< void>(& pF));
if(SUCCEEDED(hr))
{
hr = pfG-> AddFilter(pF,wszName);
if(SUCCEEDED(hr))
* ppf = pF;
其他
pF-> Release();
}
返回hr;
}



BOOL pass=FALSE ;
if(!IsFilterRegistered(CLSID_MPEG4s_decoder))
pass = RegisterFilter(TEXT("C:\\Windows\\System32\\MP4SDECD.DLL"));

if(pass) //break here ,the pass value =true
hr =AddFilterByClSID(pGraph,CLSID_MPEG4s_decoder,
TEXT("MPEG4s Decoder DMO"),&pMPEG4sDecoder);
if(FAILED(hr))//but here ,hr =0x80040154
return FALSE ;

HRESULT CPlayer::AddFilterByClSID(
IFilterGraph *pfG,
const GUID & clsid,
LPCWSTR wszName,
IBaseFilter ** ppf)
{
if(!pfG || !ppf )
return E_POINTER ;
(*ppf) = 0 ;
IBaseFilter * pF =0 ;
HRESULT hr = CoCreateInstance(
clsid,
NULL,
CLSCTX_INPROC,
IID_IBaseFilter,
reinterpret_cast<void>(&pF));
if(SUCCEEDED(hr))
{
hr = pfG->AddFilter(pF,wszName);
if(SUCCEEDED(hr))
*ppf=pF ;
else
pF->Release();
}
return hr ;
}

BOOL CPlayer::IsFilterRegistered(CLSID  infilerId)
{
    IBaseFilter * pFilter = NULL ;
    if(SUCCEEDED(
        CoCreateInstance(infilerId,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,
        (void**)&pFilter) ) )
    {
        pFilter->Release();
        return TRUE ;
    }
    return FALSE ;
}

推荐答案

在GraphEdit中查看该过滤器将其视为DMO-您需要将DMO包装在IDMOWraperFilter [
Looking at that filter in GraphEdit shows it to be a DMO - you need to wrap DMO''s up in the IDMOWraperFilter[^] before you can use them as IBaseFilters

The code in that web page is almost an exact replacement for your AddFilterByCLSID function


这篇关于为什么它仍然报告没有注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆