3

我有一个接受 HWND 的 dll,(dll 中的代码);

void VideoCapture::SetVideoWindow(HWND VidWind)
{
    VideoWindow = VidWind;
}

我通过在引用中添加 dll 在示例 c#.net 应用程序中调用上述 dll,在 c#.net 中我有一个带有面板的表单,是否可以将该面板传递给 dll?我在c#中给出了如下代码

VidCapWrapper.ManagedVideoCapture cc = new VidCapWrapper.ManagedVideoCapture();

cc.SetVideoWindow( panel1);

我收到如下错误:'错误 2'VidCapWrapper.ManagedVideoCapture.SetVideoWindow(HWND__ )' 的最佳重载方法匹配有一些无效参数 D:\DirectShow_Capture_GUI\DirectShow_Capture_GUI\Form1.cs 44 13 DirectShow_Capture_GUI 错误 3 参数 1:无法转换从 'System.Windows.Forms.Panel' 到 'HWND__ ' D:\DirectShow_Capture_GUI\DirectShow_Capture_GUI\Form1.cs 44 32 DirectShow_Capture_GUI`

谁能告诉我如何将面板传递给 dll,(任何例子都会很好)?(抱歉,我对 .net 很陌生,但正在尝试创建一个示例应用程序来显示可用设备,如集成网络摄像头......然后在 c#.net 表单面板上显示预览)

编辑:感谢@Blachshma 和@Hans Passant,现在我可以将c# windows 窗体的面板传递给我的c++ dll。

我将 dll 中的函数更改为

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

在 c# 中,我将其称为 cc.SetVideoWindow(panel1.Handle);

4

2 回答 2

5

您必须小心不要将 HWND 等基本非托管类型暴露给 C# 代码。C# 编译器不允许您传递这种类型的值。这里正确的互操作类型是 IntPtr,它可以存储句柄值。所以让你的 C++/CLI 方法看起来像这样:

void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
    VideoWindow = (HWND)windowHandle.ToPointer();
}

您现在可以简单地将 panel1.Handle 传递给该方法,该方法也是 IntPtr 类型。

于 2012-12-11T14:47:49.057 回答
1

该面板有一个Handle您可以使用的属性:

Panel p = new Panel();
IntPtr handle = p.Handle;

SetVideoWindow如果您将签名设置为允许,这应该足够IntPtr

void VideoCapture::SetVideoWindow(IntPtr VidWind)

如果您必须使用 HWND,则需要使用不安全的上下文,并像这样进行转换:

HWND hwnd=(HWND)this.Handle.ToPointer();

这是包含更多信息的链接

于 2012-12-11T13:53:23.017 回答