Неполадки при чтении строки производителя с устройства HID с использованием API hid.dll - PullRequest
1 голос
/ 25 февраля 2010

Я пишу .NET-приложение, которое может взаимодействовать с HID-устройствами. Я хочу иметь возможность получать и анализировать строку «Производители» из прошивки устройства. Я знаю, что в hid.dll есть метод с именем HidD_GetManufacturerString. MSDN описывает этот метод следующим образом:

 BOOLEAN   HidD_GetManufacturerString(
     IN HANDLE  HidDeviceObject,
     OUT PVOID  Buffer,
     IN ULONG  BufferLength
     );

Обертка, которую я использую для этого метода, выглядит следующим образом ...

[DllImport("hid.dll", SetLastError = true)]
        internal static extern Boolean HidD_GetManufacturerString(
            SafeFileHandle hFile,
            Byte[] SerialNumber,
            Int32 SerianNumberLength);

Мне нужно знать две вещи. Во-первых, как мне узнать, какой размер инициализировать буфер SerialNumber? Когда я выполняю такие операции, как GetFeatureReport, я знаю, какой размер создать в буфере, потому что я могу извлечь максимальную длину отчета о функциях из атрибутов устройства, используя HidD_GetAttributes (); К сожалению, этот метод не дает мне никакой информации о длине строки производителя, строке серийного номера, имени продукта и т. Д.

Мой второй вопрос: как правильно проанализировать байтовый массив, возвращаемый в строку? Я пытался использовать

System.Text.Encoding.ASCII.GetString(MfrBuffer)

но я получаю странный результат. Для продукта, изготовленного Dell, моя строка выглядит следующим образом: "D \ 0e \ 0l \ 0l \ 0 \ 0 \ 0 \ 0 \ 0 ...", "\ 0" продолжается до конца буфера, который я передал. Как мне разобрать это в "Dell"?

1 Ответ

1 голос
/ 25 февраля 2010

Похоже, что «Dell» возвращается в виде строки в юникоде (вы можете определить по \ 0 между каждым символом). так что вы бы использовали.

System.Text.Encoding.Unicode.GetString(MfrBuffer)

Что касается длины буфера, документация для этой функции говорит

Максимально возможное количество символов во встроенной строке зависит от устройства. Для устройств USB максимальная длина строки составляет 126 широких символов (не включая завершающий символ NULL).

Таким образом, размер буфера должен составлять (126+1) * 2 байт.

Тогда вы можете использовать TrimEnd("\0".ToCharArray()), чтобы удалить дополнительный трейлинг \ 0s

...