gpt4 book ai didi

c# - WinUSB_Initialize 函数出现 INVALID_FUNCTION (0x1) 错误

转载 作者:行者123 更新时间:2023-12-02 01:06:23 25 4
gpt4 key购买 nike

为什么WinUSB_Initialize函数会出现INVALID_FUNCTION (0x1) Error?这是 winusb.dll 中的一个函数,它返回一个接口(interface)句柄。

我想获得一个接口(interface)句柄。我已经有一个设备句柄。

internal struct devInfo
{
internal SafeFileHandle deviceHandle;
internal IntPtr winUsbHandle;
internal Byte bulkInPipe;
internal Byte bulkOutPipe;
internal Byte interruptInPipe;
internal Byte interruptOutPipe;
internal UInt32 devicespeed;
}

internal const Int32 FILE_ATTRIBUTE_NORMAL = 0X80;
internal const Int32 FILE_FLAG_OVERLAPPED = 0X40000000;
internal const Int32 FILE_SHARE_READ = 1;
internal const Int32 FILE_SHARE_WRITE = 2;
internal const UInt32 GENERIC_READ = 0X80000000;
internal const UInt32 GENERIC_WRITE = 0X40000000;
internal const Int32 OPEN_EXISTING = 3;

[DllImport("winusb.dll", SetLastError = true)]
internal static extern Boolean WinUsb_Initialize
(SafeFileHandle DeviceHandle,
ref IntPtr InterfaceHandle);

internal devInfo myDevInfo; // = new devInfo();

public IntPtr Get_WinUSB_handle()
{

Guid myGuid = Get_HID_GUID();
IntPtr deviceInfoSet = Get_Device_Info_Set(myGuid);
SP_DEVICE_INTERFACE_DATA MyDeviceInterfaeData = Get_Device_Interface_Data(deviceInfoSet, myGuid);
IntPtr detailDataBuffer = Get_Structure_with_Device_PathName(deviceInfoSet, ref MyDeviceInterfaeData);
string devicePathName = Get_Device_PathName(detailDataBuffer);

myDevInfo.deviceHandle= CreateFile(devicePathName,
(GENERIC_WRITE | GENERIC_READ),
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);

Boolean success;
success = WinUsb_Initialize(myDevInfo.deviceHandle, ref myDevInfo.winUsbHandle);
System.Console.WriteLine(Marshal.GetLastWin32Error());
System.Console.WriteLine(success);


return myDevInfo.winUsbHandle;

}

最佳答案

       success = WinUsb_Initialize(...);
System.Console.WriteLine(Marshal.GetLastWin32Error());

这种错误检查是错误的。仅当 winapi 函数失败时调用 Marshal.GetLastWin32Error() 才有效。因此,一个坚如磐石的要求是首先检查 success 。如果函数实际成功,无论如何调用 GetLastWin32Error() 都会产生任意垃圾值。 ERROR_INVALID_FUNCTION 肯定有很高的垃圾值(value)。

当实际 出现错误时,代码也相当糟糕,它几乎没有发出足够的噪音,客户端代码可以轻松忽略无效的句柄值。正确的代码是:

       bool success = WinUsb_Initialize(...);
if (!success) throw new System.ComponentModel.Win32Exception();

异常构造函数已调用 Marshal.GetLastWin32Error() 并将生成适当的本地化错误消息。

关于c# - WinUSB_Initialize 函数出现 INVALID_FUNCTION (0x1) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22034589/

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