gpt4 book ai didi

c# - 获取设备句柄时出错

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:42 24 4
gpt4 key购买 nike

我一直在尝试连接到 GPS 接口(interface)卡的设备驱动程序。我从供应商那里得到的示例是用 C++ 编写的。我正在尝试使用 pinvoke 让它在 C# 中工作

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 user buffer。

感谢帮助

最佳答案

您的 SetupDiGetClassDevs 原型(prototype)没有 SetLastError=true。因此,对 Marshal.GetLastWin32Error 的调用可能无法获得正确的值。此外,除非调用返回的值无效,否则不应检查最后一个错误。

作为 GetLastError 的文档说:

You should call the GetLastError function immediately when a function's return value indicates that such a call will return useful data.

所以使用 Marshal.GetLastWin32Error 的模式应该是:

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

如果您在没有错误的情况下检查最后一个错误,则不知道您会得到什么值。并非所有函数在成功时都会调用值为 0 的 SetLastError。所以你可能从很久以前就收到了一个错误。

关于c# - 获取设备句柄时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13575437/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com