У меня проблема при вызове метода WinUsb_WritePipe.
Сначала я начинаю с вызова метода CreateFile, который предоставляет мне дескриптор.Затем я вызываю метод «WinUsb_Initialize», чтобы получить WinUsbHandle.
После этого я получаю некоторую информацию о своем USB-устройстве, вызывая «WinUsb_QueryDeviceInformation», «WinUsb_QueryInterfaceSettings» и «WinUsb_QueryPipe» без каких-либо проблем.1006 * Моя проблема добавляется, когда мне приходится вызывать метод WinUsb_WritePipe.В первой библиотеке, которую я сделал на языке Си, она работает правильно.Но я должен переключиться с C на C # для моей новой библиотеки, и метод возвращает False, и последняя ошибка, которую я получаю, - INVALID_PARAMETER.
Похоже, что это происходит из-за перекрывающегося параметра.Я не могу передать NULL этому параметру, как указано в спецификации.
Я не вижу, что я делаю неправильно.
Я уже пробовал:
Я уже пытаюсь изменить тип параметра Overlapped с IntPtr, на Int, чтобы поставить 0, как для вызова языка Си.
Я пытался изменить IntPtr структурой NativeOverlapped.В первый раз со структурой NULL, но у меня та же проблема.
Если я дал инициализированную структуру, я пытаюсь вызвать метод GetOverlappedResult, но он просто возвращает INVALID_PARAMETER, поэтому проблема всегда присутствует.
IЯ пытался использовать небезопасный для управления методом как вызов C, но проблема все еще здесь.
Вы можете найти мой код ниже:
[DllImport("winusb.dll", SetLastError = true)]
internal static extern Boolean WinUsb_WritePipe(IntPtr InterfaceHandle, Byte PipeId, Byte[] Buffer, UInt32 BufferLength, ref UInt32 LengthTransferred, IntPtr Overlapped);
Byte[] SendBuffer = new Byte[3];
SendBuffer[0] = 0x01;
SendBuffer[1] = 0x0D;
SendBuffer[2] = 0x00;
UInt32 BytesToWrite = Convert.ToUInt32(SendBuffer.Length);
UInt32 BytesWritten=0;
IntPtr Handle = DeviceUSB.GetHandle(); //corresponding to the WinUsbHandle
Byte Pipe = DeviceUSB.GetPipe(DeviceUSB.GetSelectedMode()).PipeOutId; // 0x04
Success = WinUsbApiCalls.WinUsb_WritePipe(Handle, Pipe, SendBuffer, SizeToSend, ref SizeSent, IntPtr.Zero);
Я ожидаювозвращаемое значение установлено в true, а SizeSent равно 3., но в действительности возвращается false, а lastError установлено в INVALID_PARAMETER, а SizeSent равно 0.