我有一个接受HWND的dll, (dll中的代码);
void VideoCapture::SetVideoWindow(HWND VidWind)
{
VideoWindow = VidWind;
}
我在示例c#.net应用程序中通过在引用中添加dll调用上面的dll,在c#.net中我有一个带有Panel的表单,是否可以将该面板传递给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中更改了我的func
void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
VideoWindow = (HWND)windowHandle.ToPointer();
}
在c#我称之为 cc.SetVideoWindow(panel1.Handle);
答案 0 :(得分:4)
你必须小心不暴露从根本上非托管类型,如HWND到C#代码。 C#编译器不允许您传递此类型的值。这里适当的互操作类型是IntPtr,它可以存储句柄值。因此,使您的C ++ / CLI方法如下所示:
void VideoCapture::SetVideoWindow(IntPtr windowHandle)
{
VideoWindow = (HWND)windowHandle.ToPointer();
}
您现在可以简单地将panel1.Handle传递给类型为IntPtr的方法。
答案 1 :(得分:1)