Einzelnen Beitrag anzeigen

Viktorii

Registriert seit: 19. Jul 2007
358 Beiträge
 
#1

Zugriffsverletzung bei(Kommunikations)Timeout mit overlapped

  Alt 1. Okt 2007, 11:06
Moin zusammen.

Ich möchte von einem USB-Geräte lesen und es beschreiben können. Dazu benutze ich DriverX von Tetradyne. Das funktioniert soweit auch alles wunderbar.
Wenn ich nun vom Gerät lesen möchte, dieses aber nicht antwortet bleibt meine Anwendung in der Read Funktion 'stecken'. Ich möchte also sowas wie ein Timeout haben. Der Treiber bietet keine Möglichkeit einen Timeout einzustellen. Die einzige Chance die ich sehe ist es mit 'overlapped' zu realisieren. 'Overlapped' war mit bis jetzt noch kein Begriff. Die Dokumentation gibt leider nicht viel her:

Zitat:
Reads from a USB device bulk endpoint.


BOOL DXUSBAPI UsbBulkRead(PDXUSB_DEVICE device, ULONG iIndex, ULONG endpoint, ULONG flags, PVOID buffer, ULONG cb, PULONG pcbRet, LPOVERLAPPED pol);

Parameters

...

pol

Pointer to initialized OVERLAPPED structure to use for request or NULL to block on completion.

...

Comments
If pol is NULL, UsbBulkRead will block on completion of the request. If pol is not NULL, then UsbBulkRead will return immediately. The caller can then block on completion of the request using the specified OVERLAPPED structure and the Win32 WaitForSingleObject or GetOverlappedResult APIs.

Nun habe ich ein wenig rumgegooglet und habe versucht, das was ich gefunden habe umzusetzten:


Code:
procedure InitOverlapped(var Overlapped : lpOverlapped);
begin
  Overlapped.Offset := 0;
  Overlapped.OffsetHigh := 0;
  Overlapped.Internal := 0;
  Overlapped.InternalHigh := 0;}
  Overlapped.hEvent := CreateEvent(nil,True,False,'');
end;


function ReceiveCommand(...):..
var
  ...
  Overlapped     : lpOverlapped;

begin

  InitOverlapped(Overlapped);

  Ret := UsbBulkRead(deviceHandle, 0, 0, 0, @USBcb, 8, BytesReceived, Overlapped);
Wenn ich nun aber das Programm ausführe und auf ein Element der Overlapped Struktur zugegriffen wird, kommt es zu einer Zugriffsverletzung:

Zitat:
Im Projekt xyz.exe ist eine Exception der Klasse EaccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00464ED1 in Modul xyz.exe'. Schreiben von Adresse 00431a20' aufgetreten.
Kann dies nicht wirklich nachvollziehen und habe auch keine hilfreichen Informationen ergooglen können.

Wer kann bei mir für Aufklärung sorgen?

Vielen Dank für jegliche Hinweise und Hilfe!
  Mit Zitat antworten Zitat