0
定義它的結構用C定義++是:嘗試調用DLL,但是該方法具有複雜的結構類型,我上無法在.net
typedef struct _DEVICE_PATH_LIST_
{
int NumDevice;
TCHAR *devicePath[DEVICE_PATH_LIST_SIZE];
} DEVICE_PATH_LIST;
和C++函數的定義是:
LandiWin_iGetDevicePathList(int iDeviceType, DEVICE_PATH_LIST * devicePathList);
然後我想調用這個方法,所以我需要定義一個結構體來代表DEVICE_PATH_LIST
。這裏是我在C#中的定義:
[StructLayout(LayoutKind.Sequential)]
public unsafe struct DevicePathType
{
public int NumDevice;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]
public char*[] devicePath;
}
但它是不正確的,我也試過所有其他類型,但都失敗了。請幫我定義一個正確的struct,謝謝。
如果你需要傳遞32層以上的設備?數據是傳遞給函數還是由它返回?相信函數簽名完全定義接口是一個非常常見的錯誤。您還必須詳細說明語義。這樣做的一個好方法是使用C++顯示示例調用代碼。 –
你的[MarshalAs]很好,最好使用公共的IntPtr [] devicePath。根據C代碼的構建方式,用Marshal.PtrToStringAnsi()*或* Marshal.PtrToStringUni()恢復字符串。可能是Ansi給你char *有問題。注意存在內存管理問題,如果調用者需要釋放字符串,則可能會泄漏內存。通過調用該方法一百萬次來測試。而且你必須獲得CallingConvention的權利,可能是Cdecl。 –
@HansPassant,謝謝。當我使用IntPtr []替換char * []時,它工作正常 –