Я пытался подключиться к драйверу устройства для карты интерфейса 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 пользовательский буфер.
Спасибо за помощь
Ваш SetupDiGetClassDevs
прототип не имеет SetLastError=true
, Так что призыв к Marshal.GetLastWin32Error
может не получить правильное значение. Кроме того, вы не должны проверять последнюю ошибку, если значение, возвращаемое при вызове, недопустимо.
В качестве документации для GetLastError говорит:
Вы должны вызывать функцию GetLastError немедленно, когда
Возвращаемое значение функции указывает, что такой вызов вернет полезный
данные.
Таким образом, шаблон для использования Marshal.GetLastWin32Error
должно быть:
IntPtr hDeviceInfo = SetupDiGetClassDevs( ... );
if (hDeviceInfo == IntPtr.Zero)
{
// error here
lastError = Marshal.GetLastWin32Error();
}
Если вы проверите последнюю ошибку, когда ошибки не было, неизвестно, какое значение вы получите. Не все функции вызывают SetLastError
со значением 0, когда они успешны. Таким образом, вы можете получить сообщение об ошибке давно.
Других решений пока нет …