我用VS2008写的的第一个Filter,遇见的一些问题,和解决方法,更新结束。

 建立工程时用的Win32 Project,然后选择Dll,选择Empty project.Finish。

GetTextExtentPoint32(inDC, mTitle, lstrlen(mTitle), &mTitleSize);
1>d:/我的试验场/testtransformfilter/testtransformfilter/coverlaycontroller.cpp(151) : error C2664: 'lstrlenW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

mTitle类型为char*,起初我把改成
GetTextExtentPoint32(inDC, (WCHAR*)mTitle, lstrlen((WCHAR*)mTitle), &mTitleSize);
编译通过。

编译,出现以下错误:
1>TestTransformFilter.obj : error LNK2019: unresolved external symbol "public: __thiscall CTransInPlaceFilter::CTransInPlaceFilter(wchar_t *,struct IUnknown *,struct _GUID const &,long *,bool)" (??0CTransInPlaceFilter@@QAE@PA_WPAUIUnknown@@ABU_GUID@@PAJ_N@Z) referenced in function "public: __thiscall CTestTransformFilter::CTestTransformFilter(wchar_t *,struct IUnknown *,long *)" (??0CTestTransformFilter@@QAE@PA_WPAUIUnknown@@PAJ@Z)
1>TestTransformFilter.obj : error LNK2019: unresolved external symbol "void __stdcall DbgBreakPoint(wchar_t const *,wchar_t const *,int)" (?DbgBreakPoint@@YGXPB_W0H@Z) referenced in function "public: virtual long __thiscall CTransInPlaceFilter::GetMediaType(int,class CMediaType *)" (?GetMediaType@CTransInPlaceFilter@@UAEJHPAVCMediaType@@@Z)
1>COverlayController.obj : error LNK2019: unresolved external symbol "void __stdcall DbgAssert(wchar_t const *,wchar_t const *,int)" (?DbgAssert@@YGXPB_W0H@Z) referenced in function "public: void __thiscall COverlayController::SetInputVideoInfo(struct tagVIDEOINFOHEADER const *)" (?SetInputVideoInfo@COverlayController@@QAEXPBUtagVIDEOINFOHEADER@@@Z)

这回我是没辙了,好久没有解决。
之后开始对比Project->Property里面的选项,其中修改两处
General->Character Set->not set
Linker->Input->Ignore All Default libraries->YSE
编译通过。其中第二项修改之后错误依旧,主要是第一项有用。

此时GetTextExtentPoint32(inDC, (WCHAR*)mTitle, lstrlen((WCHAR*)mTitle), &mTitleSize);错误
去掉(WCHAR*)解决。



完成Filter,使用Regsvr32注册时,提示无法定位输入点。DllRegisterServer是写了的。

解决办法:写一个def文件,再在property->Linker->module definition file->输入./TestTransformFilter.def

编译成功,注册成功,但注册时提示:hInst != 0,at line 387 of ./dllsetup.cpp
应该是个断言错误。不知道release会不会正常,解决办法和出错原因随后去找。至少现在已经注册成功。

起初一直以为不需要DllMain,以为这函数被封装在DShow里,而且《开发指南》的源代码里也没有这句话。
上面的问题可以这样解决:
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);

BOOL APIENTRY DllMain(HANDLE hModule,
                      DWORD  dwReason,
                      LPVOID lpReserved)
{
    return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
}


不过,《开发指南》的源代码里为什么不需要这两句话呢,可能和编译器设置有关,我会查清楚的。

删掉上面几句话,把源代码的所有的编译器设置,在我的新工程的编译器选项一一更改,还是那个老问题,无法解决。
有一点引起我注意的,是在Linker->Advance->Entry Point,《开发指南》的源代码写了一个:DllEntryPoint@12,我把这句话在我的工程里设置后,编译不通过。
error LNK2001: unresolved external symbol __pRawDllMain

把上面两句话加进去,又编译通过。

哎,到最后也没有解决为什么《开发指南》不用写这两句话的。是否在新建工程时选择的了Dll或者ATL的支持。我在新建时是把这两项取消的,也不知道怎样通过修改编译器把这些支持加上。
下次新建工程时,选择ATL试试。


注册Filter后,使用GraphEdit测试,选了一个ASF文件播放。弹出对话框:This graph can't play,未指定的错误,Return code:0x80004005,此时发现Mpeg4 Decoder DMO竟然在我的TransformFilter之后,我的Filter可没有解码的功能。相同的代码,《开发指南》的源代码生成的Filter顺序就正常,Mpeg4 Decoder DMO在源Filter之后,TransformFilter在Mpeg4 Decoder DMO之后。
此时右键检查Input Pin的属性,书上的FIlter显示:RGB32,32Bit
而我的Filter却显示:YUY2,16Bit
相同的代码,为什么会出现这种情况,有没有高人指点一下。

2008年7月23日,下午:问题终于解决了。大家尽情BS我吧,犯了一个不可原谅的错误,此处贴出源代码:
HRESULT CTestTransformFilter::CheckInputType(const CMediaType* mtIn)
{
    if (IsStopped() && *mtIn->Type() == MEDIATYPE_Video)
    {
        if (*mtIn->Subtype() == MEDIASUBTYPE_RGB32 ||
            *mtIn->Subtype() == MEDIASUBTYPE_RGB24 ||
            *mtIn->Subtype() == MEDIASUBTYPE_RGB555 ||
            *mtIn->Subtype() == MEDIASUBTYPE_RGB565)
        {
            return NOERROR;
        }
    }
    return E_INVALIDARG;
}
哦,这个代码是对的,我想说的是:return E_INVALIDARG;这句话,之前我写的是return 0;我说Pin怎么总是连接的乱七八糟。还以为有什么类型检查的玄机。
苍天呀,我办事怎么总是这样子。

崩溃,这路怎么这么长,完全照着书来,也会这么难。

最后再提醒一点,就是属性页的事情,编码倒没什么好注意的,但属性页的那个Dialog,有很多属性的,如果不选对,属性页根本弹不出来,连CreateInstance都进不去。


第一个Filter,编写结束。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值