建立工程时用的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,编写结束。
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,编写结束。