【问题标题】:how to pass window handle to c++ win32 dll from C#如何从 C# 将窗口句柄传递给 c++ win32 dll
【发布时间】:2014-01-29 04:28:09
【问题描述】:

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

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

【问题讨论】:

  • 我搜索了很多,我也得到了答案,但我想知道,在 dll 中如何添加从 C# 获取窗口句柄的函数

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


【解决方案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);
           ...       
    }
 } 

【讨论】:

    【解决方案2】:

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

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

    根据您的 C++ DLL 函数将 .Net 数据类型的 marshaling 转换为 C 数据类型的参数类型,可能会变得复杂。

    【讨论】:

    • 你能告诉我该怎么做才能在 dll 中获取窗口句柄
    • 您的 C++ DLL 必须有一个函数,您可以使用该函数将窗口句柄传递给它。您需要为上述函数编写 P/Invoke 定义并调用它。你需要知道你的 C++ DLL 的 API 才能知道调用什么函数。
    • 你能告诉我如何将主窗口的句柄传递给 C++ dll
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2022-01-02
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多