为什么它仍然报告没有注册 [英] why it still reports no registered
问题描述
你好:
在我印象中,出现在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 asIBaseFilter
s
The code in that web page is almost an exact replacement for yourAddFilterByCLSID
function
这篇关于为什么它仍然报告没有注册的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!