我想从c#调用c ++ dll中的函数,但我无法使其工作。 这是函数的Dokumentation:
VOID WINAPI EnumerateHidDevices(PVOID pContext,ENUM_HID_PROC Callback);
功能说明: 枚举系统中的所有EETI PCAP HID触摸设备。
参数:的
pContext :指针指向调用者准备的内存。该地址将传递给回调例程。
回拨:来电者准备了回调例程。只要API枚举PCAP触摸设备,就会调用此回调例程。
ENUM_HID_PROC :设备枚举回调例程的原型。
的typedef BOOL(WINAPI * ENUM_HID_PROC)(PVOID pContext,LPCTSTR szSymbolicName,LPCTSTR szProduct,ULONG ulInLength,ULONG ulOutLength);
pContext :指向调用程序为调用程序准备的缓冲区。
szSymbolicName :设备枚举器枚举的设备符号链接名称。此字符串需要用于使用OpenHIDDevice打开设备。
szProduct :标识产品名称
ulInLength :输入报告的最大大小(以字节为单位)。此参数需要用于使用OpenHIDDevice打开设备。
ulOutLength : 最大输出报告大小(以字节为单位)此参数需要用于使用OpenHIDDevice打开设备。
它是如何看待c#中的那一刻:
public HID_DEVICE_INFO m_HIDDevInfo = new HID_DEVICE_INFO();
public struct HID_DEVICE_INFO
{
public string strDeviceName;
public uint m_ulInLength;
public uint m_ulOutLength;
public ushort m_VID;
public ushort m_PID;
}
public delegate int ENUM_HID_PROC(object pContext, string szSymbolicName, string szProduct, uint ulInLength, uint ulOutLength);
[DllImport("HIDdAPI.dll")]
public static extern void EnumerateHidDevices(object pContext, ENUM_HID_PROC Callback);
public MainView1()
{
InitializeComponent();
EnumerateHidDevices(m_HIDDevInfo, EnumUsbHidCallback);
}
public static int EnumUsbHidCallback(object pContext, string szDeviceName, string szProduct, uint ulInLength, uint ulOutLength)
{
HID_DEVICE_INFO pInfo = (HID_DEVICE_INFO)pContext;
pInfo.strDeviceName = szDeviceName;
Console.Write("\r\n");
Console.Write("Enumerate EETI HID Device: {0}\r\n", pInfo.strDeviceName);
Console.Write("\r\n");
pInfo.m_ulInLength = ulInLength;
pInfo.m_ulOutLength = ulOutLength;
return 1;
}
这在EnumerateHidDevices(m_HIDDevInfo,EnumUsbHidCallback)的ArgumentException中结束:
发生了System.ArgumentException
的HResult = -2147024809
消息=值不在预期范围内。
源= mscorlib程序
堆栈跟踪: 在System.StubHelpers.ObjectMarshaler.ConvertToNative(Object objSrc,IntPtr pDstVariant) InnerException:
问题出在哪里?
感谢您的帮助。
答案 0 :(得分:0)
Imho您的代码不安全。我无法看到您将对象固定在代码段中的任何位置。我相信正确的方法是将IntPtr
传递给方法并通过Marshal.StructureToPtr
获取指向struct
的指针。
您可能还想查看this question.