Negativer Rückgabewert von DLL-Aufruf

Für allgemeine Fragen zur Programmierung mit PureBasic.
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Negativer Rückgabewert von DLL-Aufruf

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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.
Bild
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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.
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag von ccode_new »

DePe hat geschrieben:Ich schmeiß mich vor einen Fußgänger!
:mrgreen:

Aber falle nicht über deine eigenen Füße.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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
DePe
Beiträge: 153
Registriert: 26.11.2017 16:17
Wohnort: Wien
Kontaktdaten:

Re: Negativer Rückgabewert von DLL-Aufruf

Beitrag 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
Antworten