从c#

时间:2017-11-28 12:35:32

标签: c#

我想从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:

问题出在哪里?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Imho您的代码不安全。我无法看到您将对象固定在代码段中的任何位置。我相信正确的方法是将IntPtr传递给方法并通过Marshal.StructureToPtr获取指向struct的指针。

您可能还想查看this question.