将托管控件句柄提供给非托管代码-访问冲突

本文关键字:非托管代码 访问冲突 控件 句柄 | 更新日期: 2023-09-27 18:07:12

所以我有这个由第三方提供的SDK,用于从远程源观看流媒体视频。远程源运行第三方提供的服务器,用于捕获和存储视频,我可以连接到该服务器并通过SDK获取视频。我通过COM引用SDK,基本的非图形操作,如连接到服务器,选择视频馈送等都工作得很好。

问题是,使用此SDK实际向用户显示视频的主要(唯一)方法是将hWnd(作为int)传递到一个方法中,然后该方法将异步地将视频绘制到该窗口的客户端区域。据我所知,这里的"窗口"有GUI窗口的含义,在。net术语中,它是任何带有窗口句柄的WinForms控件。在我的例子中,我使用了PictureBox控件(每个用户希望看到的提要一个控件)。

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

帮助吗?我希望我能提供更多的信息或代码示例,但我不能提供任何足以在一般情况下工作的内容,我也不能透露正在使用的SDK。我认为我所需要的只是告诉。net,我所引用的代码应该被信任,可以用窗口做它想做的事情,或者以某种方式将窗口移动到我的程序舒适的沙盒之外的管理较少的内存空间。

EDIT:好的,已经取得了一点进展。在将句柄提供给方法之前,我现在正在验证是否已经使用IsHandleCreated创建了控件的句柄。然而,正如汉斯·帕桑特所说,IntPtr不是int。那么,我该如何把这个方钉装进圆孔里呢?我尝试了ToInt32()函数和显式转换为(int)。两者都不起作用,即使在将我的库编译为32位架构时也是如此。我回到第三方,说他们的SDK是POS不让我传递一个指针?

将托管控件句柄提供给非托管代码-访问冲突

这应该可以正常工作。windows窗体控件的Control.Handle只是来自windows API的标准HWND。许多DirectX示例使用这种技术。

也就是说,要确保在控件创建之后才将其传递到本机代码中。例如,如果您在表单的构造函数中传递句柄(在Load之前),那么此时该句柄将无效。