2011-09-01 74 views
1

所以我有这个SDK由第三方提供,用于查看来自远程源流式视频。远程源运行由捕获和存储视频的第三方提供的服务器,并且我可以连接到该服务器并通过SDK获取视频。我通过COM引用SDK,并且像连接到服务器,选择视频源等基本的非图形操作都工作得很好。给托管控制句柄非托管代码 - 访问冲突

问题是,使用此SDK实际向用户显示视频的主要(唯一)方法是将hWnd(作为int)传递到方法,然后将该视频异步地绘制到该客户端区域窗口。据我所知,这里的“窗口”具有GUI窗口的含义,在.NET中,窗口将是带窗口句柄的任何WinForms控件。就我而言,我正在使用PictureBox控件(用户希望看到的每个Feed都有一个控件)。

问题是,我显然不能将托管的PictureBox控件的句柄放到这个SDK方法中,因为当我这样做时,我从非托管线程接收到一个AccessViolationException。我正在使用VB 6编写的一个示例程序(它在我的计算机上对测试服务器工作),它使用VB PictureBox执行相同的操作,而且工作得很好,但显然无论SDK试图做什么我们不错的安全.NET沙箱对象不会与CLR一起飞行。

帮助?我希望我可以提供更多信息或代码示例,但我无法提供足够的消毒功能,以至于无法在一般情况下使用,而且我也无法透露正在使用的SDK。我认为我需要的仅仅是告诉.NET,我的引用代码应该被信任,以便在窗口上做它想做的事情,或者以某种方式将窗口移动到我的程序的舒适沙箱之外的管理较少的内存空间。

编辑:好的,取得了一些进展。我现在正在验证该控件的句柄是否在使用方法的句柄之前使用IsHandleCreated创建的。但是,正如Hans Passant所说,IntPtr不是一个整数。那么,我该如何将这个方形钉放入圆孔?我已经尝试了ToInt32()函数和显式转换为(int)。即使编译我的库为32位体系结构,也不行。我是否会回到第三方,并说他们的SDK是不让我传递指针的POS?

+1

应该工作。 hWnd不是int,不要试图在64位操作系统上运行。没有你的帮助,本地代码有很多方法可以用AV炸弹。 –

+0

你知道吗?那可能就是这样;我在Win7 64位开发,互操作需要一个int,我不能直接传递IntPtr Control.Handle。 – KeithS

回答

5

这应该很好。对于Windows窗体控件,一个Control.Handle只是Windows API的一个标准HWND。许多DirectX示例使用这种精确的技术。

这就是说,确保在创建控件之后才能将其传递到本机代码中。例如,如果您在窗体的构造函数中(加载之前)传递句柄,则该句柄在该点处将无效。

+0

谢谢。包含相关PictureBox的整个UserControl将尝试在其Load事件中设置最初的一组视频源。这太快了吗? – KeithS

+0

这是问题;该控件的IsHandleCreated属性为false,因此我不能依赖此时的句柄值。我添加了一个将跳过此电话的支票,但现在视频永远不会显示,因为显然没有处理。更多帮助? – KeithS

+0

@KeithS:请参阅:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handlecreated.aspx它可能会有所帮助:) –