DirectShow视频捕获过滤器 - IPersistPropertyBag :: Load()返回E_ENVALIDARG

时间:2011-03-24 19:51:27

标签: windows-mobile directshow video-capture

这个让我发疯。

Windows Mobile 6示例CameraCapture适用于所有经过测试的WM 6设备。 我在大型复杂程序中添加了相同的图形结构。在某些设备上,CLSID_VideoCapture过滤器无法通过IPersistPropertyBag :: Load()接口调用接受摄像机名称,并返回E_INVALIDARG(0x80070057)。

我的程序在一台WM 6.5设备上运行正常,所以我认为摄像机名称正在正确地传送到过滤器。似乎存在一些外部冲突,导致相机无法与某些设备上的过滤器关联。 WM 6.1和WM 6.5设备都发生故障。

我已经检查过很多次了,但是找不到任何简单的样本CameraCapture(总是有效)和我的复杂程序(只能在一台设备上运行)之间的任何有罪差异。以下是一些更多细节:

  1. 所有工作都在主线程上完成(CameraCapture使用辅助线程,但如果在主线程上完成图形构建,则行为相同)。
  2. E_INVALIDARG未列为IPersistPropertyBag :: Load()的可能返回值。我认为错误来自相机初始化的一些内部方面。
  3. 如果我传递了一个像“CAM”这样糟糕的摄像机名称,我会得到0x80070002,“找不到设备/文件”。我的包里没有名字,我得到0x8007000d“数据无效”。
  4. 我已经为Load(& PropBag,& ErrorLog)实现了一个CErrorLog,它在Load()期间从不被调用,因此没有更多可用的细节。
  5. 两个程序之间的编译和链接设置大致相同。
  6. 两个程序都使用CoInitializeEx(NULL,COINIT_MULTITHREADED),复杂程序在一台设备上运行正常。
  7. CameraCapture和我的程序中的摄像头选择几乎与此处的说明相同:http://msdn.microsoft.com/en-us/library/aa918757.aspx
  8. 我发现另外一个提到这个问题:http://www.eggheadcafe.com/software/aspnet/30318752/problem-with-propertybag.aspx
  9. 对错误的真正含义或冲突可能导致的任何想法都表示赞赏。

    感谢。

1 个答案:

答案 0 :(得分:0)

怀疑,我发现了一场外部冲突。我的所有设备都有条形码扫描仪。在某些情况下,扫描仪和相机之间存在冲突。当然,CameraCapture示例不包含任何扫描仪控件,因此它始终有效。这些设备可能共享一些接口硬件以节省一美元,从而削弱了可用性。现在我只需要进行一些独家分享。