如何从C#传递窗口句柄到c ++ win32 dll

时间:2014-01-29 04:28:10

标签: c# c++ visual-c++ dll

我有一个项目,它捕获来自多个C ++的摄像机的图像。我想在我的新项目中使用该项目,这是在C#。我已经制作了该项目的dll。我的问题是,我怎么能用它我的项目中的DLL。我知道通过将窗口句柄传递给C ++ DLL我们可以使用它但我不知道该怎么做以及我应该在dll中做出哪些更改。

请原谅,如果这是愚蠢的问题。

2 个答案:

答案 0 :(得分:1)

我确实遇到了问题,这篇文章帮助了我。 http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx

要传递句柄,可以在C ++端添加另一个函数。像,

(在标题中)
extern "C" __declspec(dllexport) void SetParent(HWND hWnd);

在C#中使用SetParent

 class Program
 {
    ...

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate void SetParent(IntPtr hWnd);

    public void testMethod()
    {
           ...
           IntPtr getAddress = NativeMethods.GetProcAddress(pDll, "SetParent");
           ...
           SetParent setParent = (SetParent)Marshal.GetDelegateForFunctionPointer(getAddress, typeof(SetParent));
           setParent(this.Handle);
           ...       
    }
 } 

答案 1 :(得分:0)

如果您的C ++项目已经在DLL中,您可以使用P/Invoke调用它导出的任何函数。您必须在C#程序集中声明该方法,如下所示,但是您可以像标准静态方法一样调用它。

[DllImport("YourDllsName.dll")]
public static extern bool FunctionThatAWindowHandleAndReturnsBool(IntPtr hWnd);

根据C ++ DLL的函数所使用的参数类型,.Net数据类型的marshaling可能会使C数据类型变得复杂。