获取HID设备的MAC地址时出现问题

本文关键字:问题 地址 MAC HID 获取 | 更新日期: 2023-09-27 18:16:07

我有一个具有蓝牙HID支持的应用程序,我在我的一个调用上得到一个异常:

管理调试助手' pinvokestack失衡'在'C:'Users'Joshua'Documents'Visual Studio 2012'Projects'DS4 Tool'DS4Windows'bin'Release'DS4Windows.vshost.exe'.

附加信息:调用PInvoke函数'HidLibrary!native emethods::HidD_GetSerialNumberString'使堆栈不平衡。这可能是因为托管的PInvoke签名与非托管的目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。

c++签名:

BOOLEAN __stdcall HidD_GetSerialNumberString(
  _In_   HANDLE HidDeviceObject,
  _Out_  PVOID Buffer,
  _In_   ULONG BufferLength
);

我的签名:

[DllImport("hid.dll")]
static internal extern bool HidD_GetSerialNumberString(IntPtr HidDeviceObject, byte[] Buffer, ulong BufferLength);
我用法:

byte[] buffer = new byte[126];
NativeMethods.HidD_GetSerialNumberString(safeReadHandle.DangerousGetHandle(), buffer, (ulong)buffer.Length);
string MACAddr = System.Text.Encoding.Unicode.GetString(buffer).Replace("'0", string.Empty).ToUpper();
MACAddr = String.Format("{0}{1}:{2}{3}:{4}{5}:{6}{7}:{8}{9}:{10}{11}",
  MACAddr[0], MACAddr[1], MACAddr[2], MACAddr[3], MACAddr[4],
  MACAddr[5], MACAddr[6], MACAddr[7], MACAddr[8],
  MACAddr[9], MACAddr[10], MACAddr[11]);
serial = MACAddr;

奇怪的是,尽管有错误,该方法仍然返回MAC地址。我应该无视它吗?有没有更好的方法取回MAC?

获取HID设备的MAC地址时出现问题

C函数的BufferLength参数类型为ULONGULONG是一个32位数据类型(请参阅MSDN文档)。另一方面,c#中的ulong是64位数据类型,因此与非托管/本机ulong不匹配。

与非托管/本机ULONG数据类型对应的32位c#数据类型将是uint,因此您的c#函数声明应该看起来像:

[DllImport("hid.dll")]
static internal extern bool HidD_GetSerialNumberString(
    IntPtr HidDeviceObject,
    byte[] Buffer,
    uint BufferLength
);

(供将来参考:MSDN文档提供了一个表,显示了哪种c#数据类型应该用于哪种非托管/本机数据类型。不幸的是,这个表没有涵盖WINAPI中使用的所有非托管/本机数据类型