2010-02-04 73 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

相關問題