c # — Ошибка при получении дескриптора устройства

Я пытался подключиться к драйверу устройства для карты интерфейса GPS. Примеры, которые я имею от продавца, находятся на C ++. Я пытаюсь заставить его работать в C # с помощью pinvoke

class HaveQuick
{
[DllImport("setupapi.dll", CharSet = CharSet.Auto)]
static extern IntPtr SetupDiGetClassDevs(
ref Guid ClassGuid,
IntPtr Enumerator,
IntPtr hwndParent,
uint Flags
);

[DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean SetupDiEnumDeviceInterfaces(
IntPtr hDevInfo,
ref SP_DEVINFO_DATA devInfo,
ref Guid interfaceClassGuid,
UInt32 memberIndex,
ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData
);

Guid GUID_DEVINTERFACE_IPHQT = new Guid(0x13ff045f, 0xe9d2, 0x479c, 0xb3, 0x90, 0x8c, 0xae, 0xc7, 0xd1, 0x1c, 0xc4);
hDeviceInfo = SetupDiGetClassDevs(ref GUID_DEVINTERFACE_IPHQT, IntPtr.Zero, IntPtr.Zero, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDeviceInfo == IntPtr.Zero)
{
lastError = Marshal.GetLastWin32Error();
Console.WriteLine("**Error: couldn't get class info error code = {0}\n");
return;
}

// Find the interface for device
devNum = 0x0000;
SP_DEVICE_INTERFACE_DATA interfaceData = new SP_DEVICE_INTERFACE_DATA();                // Interface data for this device
interfaceData.cbSize = (uint)Marshal.SizeOf(interfaceData);
SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();
deviceInfoData.cbSize = (uint)Marshal.SizeOf(deviceInfoData);
success = SetupDiEnumDeviceInterfaces(hDeviceInfo, ref deviceInfoData, ref GUID_DEVINTERFACE_IPHQT, devNum, ref interfaceData);
if (!success)
{
lastError = Marshal.GetLastWin32Error();
Console.WriteLine("**Error: couldn't enum device error number = {0}\n", lastError);

}

Когда я запускаю код, я получаю lasterror = 87, который является неверным параметром

Если я заменю этой строкой кода
success = SetupDiEnumDeviceInterfaces (hDeviceInfo, IntPtr.Zero, ref GUID_DEVINTERFACE_IPHQT, devNum, ref interfaceData);

Я получаю lasterror = 1784 Invlid пользовательский буфер.

Спасибо за помощь

2

Решение

Ваш SetupDiGetClassDevs прототип не имеет SetLastError=true, Так что призыв к Marshal.GetLastWin32Error может не получить правильное значение. Кроме того, вы не должны проверять последнюю ошибку, если значение, возвращаемое при вызове, недопустимо.

В качестве документации для GetLastError говорит:

Вы должны вызывать функцию GetLastError немедленно, когда
Возвращаемое значение функции указывает, что такой вызов вернет полезный
данные.

Таким образом, шаблон для использования Marshal.GetLastWin32Error должно быть:

IntPtr hDeviceInfo = SetupDiGetClassDevs( ... );
if (hDeviceInfo == IntPtr.Zero)
{
// error here
lastError = Marshal.GetLastWin32Error();
}

Если вы проверите последнюю ошибку, когда ошибки не было, неизвестно, какое значение вы получите. Не все функции вызывают SetLastError со значением 0, когда они успешны. Таким образом, вы можете получить сообщение об ошибке давно.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]