所以我有第三方提供的SDK,用于查看来自远程源的流视频。远程源运行由第三方提供的服务器,用于捕获和存储视频,我可以连接到该服务器并通过SDK获取视频。我通过COM引用SDK,并且连接到服务器,选择视频源等基本的非图形操作都可以正常工作。
问题是使用此SDK向用户实际显示视频的主要(唯一)方法是将hWnd(作为int)传递给方法,然后将该视频异步绘制到该窗口的客户区域。据我所知,“窗口”具有GUI窗口的含义,在.NET术语中,它将是具有窗口句柄的任何WinForms控件。就我而言,我正在使用PictureBox控件(用户希望看到的每个提要一个)。
问题是我显然不能将托管PictureBox控件的句柄放入此SDK方法,因为当我这样做时,我从非托管线程收到AccessViolationException。我正在研究一个用VB 6编写的示例程序(它在我的计算机上对着测试服务器工作),它使用VB PictureBox做同样的事情,并且工作正常,但显然无论SDK试图做什么我们不错的安全.NET沙箱对象不能与CLR一起飞行。
帮助?我希望我可以提供更多信息或代码示例,但我不能提供足够的消毒,以便在一般情况下工作,我不能泄露正在使用的SDK。我认为我需要的只是告诉.NET,我的引用代码应该被信任,以便在窗口中执行它想要的操作,或者以某种方式将窗口移动到程序的舒适沙箱之外的较少管理的内存空间。
编辑:好的,取得了一些进展。我现在验证在给出方法的句柄之前,已使用IsHandleCreated创建了控件的句柄。然而,正如Hans Passant所说,IntPtr不是一个int。那么,我如何在圆孔中安装这个方形钉?我已经尝试了ToInt32()函数和显式转换为(int)。即使在为32位架构编译库时,两者都不起作用。我是否会回到第三方并说他们的SDK是不允许我传递指针的POS?
答案 0 :(得分:5)
这应该可以正常工作。用于Windows窗体控件的Control.Handle
只是Windows API的标准HWND。许多DirectX样本都使用这种精确的技术。
话虽如此,确保在创建控件之前不会将其传递给本机代码。例如,如果在窗体的构造函数(Load之前)中传递句柄,则句柄在此时将无效。