2010-02-04 72 views
2

我在C#项目中使用C++编写的DLL。我已经能够调用使用此代码的DLL中的函数:从C编写的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#中包含头文件?在此先感谢您的帮助。

回答

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”。

+1

@ rros - 我很好奇,哪个解释是正确的? – 2010-02-04 22:32:41

0

您需要在C#中创建一个struct,该C#可以在C++中映射C++ PDEV_INFOstruct

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

然后,您可以编写一个extern方法,将struct作为ref参数。

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); 
} 
+0

这是* DEV_INFO,而不是** DEV_INFO。 – 2010-02-04 19:04:55

+0

@nobugz:当'DEV_INFO'在C#中声明为* class *时不会。 – 2010-02-05 14:05:41

+0

啊,对。 [StructLayout]在类中不是可选的。 – 2010-02-05 16:19:07

相关问题