我使用的是用C ++写在我的C#项目的DLL。我已经能够调用使用该代码的DLL内的功能:

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

现在我需要调用该requres自定义类型的指针的函数。所述文档为DLL布局这样的功能:

hid_get_info(int n,PDEV_INFO *pdi)

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

有帮助吗?

解决方案

鉴于“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”的其长度。

其他提示

您需要创建在C#struct,反映在C ++中的C ++ PDEV_INFO struct

您应适用[StructLayout(LayoutKind.Sequential)]的struct,然后复制从C ++结构中的字段的顺序(看头文件)。

可以再写入一个extern方法,是以struct作为ref参数。

我会安全地假定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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top