2

我在我的 C# 项目中使用用 c++ 编写的 DLL。我已经能够使用以下代码调用 DLL 中的函数:

[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr VmHidScan();

现在我需要调用一个需要自定义类型指针的函数。DLL 的文档布局函数如下:

hid_get_info(int n,PDEV_INFO *pdi)

我不知道如何使用这个自定义指针。这是在 DLL 中定义的吗?如果是这样,如何从 C# 项目中使用它?如果不需要,我是否需要在 c# 中包含头文件?在此先感谢您的帮助。

4

3 回答 3

4

给定“P”前缀,看起来真正的声明是

hid_get_info(int n, DEV_INFO **pdi)

其中 DEV_INFO 是一个结构。您需要找到此结构的声明,并使用 [StructLayout] 属性将其添加到您的 C# 代码中。然后,您将在 C# 代码中声明这样的函数:

[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);

并使用 Marshal.PtrToStructure() 获取结构值。希望你不必释放结构,你会被搞砸的。

第二种解释是“pid”返回一个指向 DEV_INFO 结构的指针数组。有点可能给定“n”参数,这很可能意味着您传递给函数填充的数组中的元素数。在这种情况下,传递一个 IntPtr[] 并将“n”设置为其长度。

于 2010-02-04T19:03:03.927 回答
0

您需要struct在 C# 中创建一个镜像 C++PDEV_INFO struct中的 C++。

您应该申请[StructLayout(LayoutKind.Sequential)]该结构,然后按顺序从 C++ 结构中复制字段(查看头文件)。

然后,您可以编写一个externstructref参数的方法。

于 2010-02-04T19:02:12.893 回答
0

我会安全地假设PDEV_INFO*是一个DEV_INFO**.

在 C# 中使用它:

class DEV_INFO
{
    // fields go here
}

static class NativeMethods
{
    [DllImport...]
    public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}
于 2010-02-04T19:02:40.897 回答