三个问题,只给100分而已。
无我无人 2002-04-09 07:08:59 最近我们基于DirectX8.1写程序时遇到了几个问题想请教您一下,希望您能给予我们帮助,在此非常的感谢。我们的问题具体如下:
1.在Microsoft DirectX8.1/DirectShow/DirectShow Editing Services的文档里,有这样的描述:
.Effect: For video, any 2-D one-input Microsoft? DirectX? Transform object. For audio, any DirectShow audio effect filter.
.Transition: For video, any 2-D two-input DirectX Transform object. Audio does not support transitions.
文档中对 DirectX Transform object没有进一步的解释。我们在编译和注册了DirectShow提供的EZRGB24 Filter后,在DES里不能使用。我们想知道怎么写一个文档中提到的 DirectX Transform object,类似于DES中提供的缺省Effect:CrEmboss。
2.DES的Xml2Dex对象在调用WriteXMLfile或调用WriteXML方法时,如果当前时间线上的对象拥有用户数据(即:曾经对该对象调用过SetUserData方法)会出现非法内存修改及非法的NTDLL.RTLFreeHeap调用。
例:
CoInitialize(NULL);
IAMTimeline * pTL;
IXml2Dex * pXML;
IAMTimelineObj* pGroupObj;
CoCreateInstance(CLSID_AMTimeline,NULL, CLSCTX_INPROC_SERVER,IID_IAMTimeline,(void**)&pTL);
pTL->CreateEmptyNode(&pGroupObj,TIMELINE_MAJOR_TYPE_GROUP );
IAMTimelineGroup * pGroup;
pGroupObj->QueryInterface(IID_IAMTimelineGroup,(void **)&pGroup);
CMediaType VideoGroupType;
VideoGroupType.SetType( &MEDIATYPE_Video );
pGroup->SetMediaType( &VideoGroupType );
pTL->AddGroup(pGroupObj);
CoCreateInstance(CLSID_Xml2Dex,NULL, CLSCTX_INPROC_SERVER,IID_IXml2Dex,(void**)&pXML);
BYTE buffer;
buffer = 2;
pGroupObj->SetUserData(&buffer,1);//如果该处进行了数据设置,将导致上述错误。
pXML->WriteXMLFile(pTL,L"w1.xtl");//出现错误!如下:
//HEAP[Dle.exe]: Heap block at 00144388 modified at
//00144394 pastrequested size of 4
//HEAP[Dle.exe]: Invalid Address specified to RtlFreeHeap
//( 130000, 144390 )
//该错误只能在单步跟踪调试时在OutPut窗口中被发现。
pTL->Release();
pXML->Release();
pGroupObj->Release();
pGroup->Release();
CoUninitialize();
3.我们在时间线的同一轨道上拥有两个Effect对象,它们具有相同的起始和终结时间,并且CLSID相同;当其中一个对象的RemoveAll或Remove方法被调用后致使另外一个Effect对象无法被GetEffect方法获取(GetEffect方法返回指针为空)。
for(int j=0;j<2;j++)
{
CComPtr<IAMTimelineObj>pDeleteObj;
hr=pEffectable->GetEffect(&pDeleteObj,j);
ATLASSERT(!FAILED(hr));
hr=pDeleteObj->Remove();//如果在第一次循环中,进行了该调用,第二次循环到
//hr=pEffectable->GetEffect(&pDeleteObj,j)返回空指针。
//如果第一循环不进行该调用,则第二次循环到
//hr=pEffectable->GetEffect(&pDeleteObj,j)时可以得到正
//确对象
ATLASSERT(!FAILED(hr));
}