首页 文章

为非托管代码提供托管控制句柄 - 访问冲突

提问于
浏览
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我的引用代码应该被信任,以便在窗口中执行它想要的操作,或者以某种方式将窗口移动到程序的舒适沙箱之外的较少管理的内存空间 .

EDIT: 好的,取得了一些进展 . 我现在验证在给出方法的句柄之前,已使用IsHandleCreated创建了控件的句柄 . 然而,正如Hans Passant所说,IntPtr不是一个int . 那么,我如何在圆孔中安装这个方形钉?我已经尝试了ToInt32()函数和显式转换为(int) . 即使在为32位架构编译库时,两者都不起作用 . 我是否会回到第三方并说他们的SDK是一个不允许我传递指针的POS?

1 回答

  • 5

    这应该工作正常 . 用于Windows窗体控件的 Control.Handle 只是Windows API的标准HWND . 许多DirectX样本使用这种确切的技术 .

    话虽这么说,确保在创建控件之前不会将其传递给本机代码 . 例如,如果在窗体的构造函数(在加载之前)期间传递句柄,则句柄在该点处将无效 .

相关问题