在IMFMediaSource :: ReadSample中追踪E_POINTER的来源

时间:2011-05-09 03:21:02

标签: com c++-cli ms-media-foundation

我从ReadSample调用中收到E_POINTER错误,据我所知,没有一个指针无效。请参阅下面的代码段(注意,它是一个C ++ / CLI应用程序):

IMFSample* sample = NULL;
pin_ptr<IMFSample*> pinnedSample = &sample;

LONGLONG timeStamp;

HRESULT hr = mSourceReader->ReadSample(
    (DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM,
    0,
    NULL,
    NULL,
    &timeStamp,
    pinnedSample
    );

我怀疑问题在于构造mSourceReader(一个IMFSourceReader实例,从IMFMediaSource创建)。但是,唉,我不知道如何回溯并找到源代码,因为创建mSourceReader的命令链中的所有COM调用都返回了S_OK。

非常感谢任何提示。

1 个答案:

答案 0 :(得分:1)

在获取局部变量的地址时不需要pin_ptr,因为垃圾收集器永远不会移动局部变量。

我猜你传递NULL的其他三个参数中的一个是非可选的,但我需要看看你打算知道什么函数。

您是否在同步或异步模式下创建了IMFSourceReader?文档说:

  

此方法可以同步或异步完成。如果在创建源阅读器时提供回调指针,则该方法是异步的。否则,该方法是同步的。

我认为这是你的问题:

  

在同步模式下:

     
      
  • pdwStreamFlags和ppSample参数不能为NULL。否则,该方法返回E_POINTER。
  •   

您已为pdwStreamFlags传递了NULL,这是不允许的。

文档链接:http://msdn.microsoft.com/en-us/library/dd374665.aspx