Seite 1 von 2

Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 18:01
von DePe
Ich verwende die libusb-1.0 als 32- und 64-Bit Version.
Alles funktioniert, bis auf die negativen Rückgabewerte bei einem Fehler bei der 64-bit Version.

Z.B. wird aus -7 (LIBUSB_ERROR_TIMEOUT) die 4294967289.

Hier ist z.B. die 'bulk transfer' Funktion wie ich sie verwende:

Code: Alles auswählen

Import "libusb-1.0.22_64.lib"
libusb_bulk_transfer.i(*uDeviceHandle, iEndpoint.a, *Data, iLength.i, *iTransferred, iTimeout.i)
EndImport
...
Protected iError.i
iError = libusb_bulk_transfer(*uDeviceHandle, iEndpoint, *Data, iLength, *iTransferred, iTimeout)
...
Es gibt ansonst keine Fehler beim megabyteweise Datenschaufeln von USBTMC-Messgeräten damit, weder in der 32- noch 64-bit Version.
Ich habe den Fehler nur beim Anzeigen mit Str(iError), bei der Weitergabe des Fehlers an die DLL funktioniert auch alles. Ich kann damit die Fehlernamen usw. richtig auslesen.
Ich vermute ich mache etwas falsch, komme aber auf keine Idee was.

Peter

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 18:14
von NicTheQuick
int und long in C sind immer 32 Bit. Nur long long oder Pointertypen haben 64 Bit. Du musst also nur den Rückgabewert von libusb_bulk_transfer mit .l deklarieren statt mit .i.

Im Übrigen habe ich schon mal eine Library für libusb programmiert. Vielleicht hilft dir das: viewtopic.php?f=8&t=27047
Der neuste Link ist in einem der hinteren Posts versteckt.

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 18:24
von DePe
Aber dann müssten die Parameter ja auch falsch sein, z.B. iLength.i

Code: Alles auswählen

int libusb_bulk_transfer 	(	struct libusb_device_handle * 	dev_handle, 
		unsigned char 	endpoint, 
		unsigned char * 	data, 
		int 	length, 
		int * 	transferred, 
		unsigned int 	timeout 
	)
Irgendwie mag ich das jetzt nicht glauben.
Ich habe das gleiche in Xojo programmiert, dort gibt es Signed-Datentypen und der negative Rückgabewert stimmt.
Jetzt bin ich ziemlich beunruhigt.

Peter

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 19:10
von DePe
Mit Long statt Integer als Rückgabetyp stimmt der Fehlercode.
Und bei den Parametern ist es nur Zufall das es funktioniert?
Genauso bei den Strukturen, z.B. libusb_device:

Code: Alles auswählen

Structure uDevice Align #PB_Structure_AlignC
  iLock.i
  iRefCnt.i
  *uContext.uContext
  iBusNumber.a
  iPortNumber.a
  *uParentDev.uDevice
  iDeviceAddress.a
  iNumConfigurations.a
  eSpeed.i
  uList.uListHead
  iSessionData.l
  uDeviceDescriptor.uDeviceDescriptor
  iAttached.i
  iOSpriv.a[1]
EndStructure
Funktionier es weil unter 64-Bit sowieso alles auf 64-Bit ausgerichtet wird, und ein Integer statt Long keine Auswirkungen hat?

Peter

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 19:13
von NicTheQuick
Es funktioniert wahrscheinlich, weil jeder Parameter immer 64 Bit breit ist. Bei der Struktur habe ich gerade keine Zeit das genau zu prüfen. In meinen Includes habe ich mir aber recht viele Mühe gegeben damit. Da hat auch das #PB_Structure_AlignC nicht ausgereicht um die Struktur richtig zu alignen.

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 19:19
von ccode_new
Nic hat (leider) recht!

int = 32 bit
long = 32 bit
long long = 64 bit

Oder (was ich mag):
#include <stdint.h>

int64_t

Aber in der LibUSB ist es wie folgt definiert:

int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *actual_length, unsigned int timeout);

http://libusb.sourceforge.net/api-1.0/l ... ource.html

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 19:20
von DePe
Danke, so ein Mist aber auch. Alles funktioniert, und ich weiß jetzt das alles falsch ist.
Ich schmeiß mich vor einen Fußgänger!

Peter

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 19:29
von ccode_new
DePe hat geschrieben:Ich schmeiß mich vor einen Fußgänger!
:mrgreen:

Aber falle nicht über deine eigenen Füße.

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 20:46
von Shardik
In Wikipedia gibt es einen Beitrag über Datentypen in C, der in der unten abgebildeten Tabelle die Datentypen in C für die verbreitetsten Betriebssysteme zusammenfasst und die ich immer konsultiere, wenn ich C-Strukturen in Linux, MacOS oder Windows umsetzen möchte:

Bild

Re: Negativer Rückgabewert von DLL-Aufruf

Verfasst: 19.09.2018 23:21
von DePe
Ich habe jetzt die DLL-Aufrufe und die Strukturen geändert.
Im Moment schaut es gut aus, 32- und 64-Bit Versionen funktionieren. Da ich nicht alle Funktionen und Strukturen von der libusb benötige, waren die Änderungen gar nicht so mühsam.

Danke noch an alle.

Peter