![]() |
Re: DLL einbinden octopus.dll
Zitat:
|
Re: DLL einbinden octopus.dll
Zitat:
Zitat:
Das ist jetzt wohl wahrscheinlich nicht mehr delphi-spezifisch ... Habe allerdings gerade nochmal in Python an dem selben Rechner das Teil probiert, und da funktioniert es wunderbar ... Aber der Aufruf scheint ja eigentlich zu stimmen, sonst würde ja nicht 1 und der error_str zurückkommen ... Vielleicht stimmt an der dll was nicht .. Ich werd mal weiter forschen ... Falls noch jemand ne Idee hat, lasst es mich wissen :) |
Re: DLL einbinden octopus.dll
Da ich mir auch so ein Teil bestellt habe, verfolge ich das hier auch gespannt. Dein Fehler hat nicht's mehr mit der Octopus.dll zu tun sondern mit der libusb.dll. Habe mir mal den Delphi-Wrapper für die libusb.dll angeschaut und festgestellt,das der usb_handle kein integer ist, sondern ein Pointer. siehe Antwort von Omata.
Delphi-Quellcode:
Den Delphi-Wrapper findest du hier:
usb_device = packed record
next, prev: pusb_device; filename: packed array [0..LIBUSB_PATH_MAX-1] of char; bus: pusb_bus; descriptor: usb_device_descriptor; config: PArray_usb_config_descriptor; dev: pointer; // Darwin support end; usb_bus = packed record next, prev: pusb_bus; dirname: packed array [0..LIBUSB_PATH_MAX-1] of char; devices: pusb_device; location: longint; end; // Version information, Windows specific pusb_version = ^usb_version; usb_version = packed record dllmajor, dllminor, dllmicro, dllnano: integer; drivermajor, driverminor, drivermicro, drivernano: integer; end; pusb_dev_handle = pointer; // struct usb_dev_handle; // typedef struct usb_dev_handle usb_dev_handle; ![]() Evtl. bringt dich das weiter. Wal P.S. Luckie hat geschrieben:
Delphi-Quellcode:
Mit octupus_init wird ja der Pointer geholt, deshalb wird das var wichtig sein und mit octupus_open wird der Pointer wieder der Dll mitgeteilt.
function octopus_init(var context: octopus_context): integer; external 'octopus.dll';
function octopus_get_hwdesc(var context: octopus_context; desc: Pchar): Pchar; external 'octopus.dll'; function octopus_open(context: octopus_context): integer; external 'octopus.dll'; Bin noch nicht der Delphifreak, deshalb berichtigt mich falls ich falsch liege. :-) |
Re: DLL einbinden octopus.dll
Zitat:
Ich habe mal die LibUSB.pas mit in mein Testprogramm aufgenommen, aber leider passiert dabei das selbe ... Chris |
Re: DLL einbinden octopus.dll
Zitat:
|
Re: DLL einbinden octopus.dll
Zitat:
|
Re: DLL einbinden octopus.dll
Zitat:
Meiner Meinung müßte das so gehen:
Delphi-Quellcode:
Mit octopus_init bekommst du den Pointer auf das USB_Handle mitgeteilt, den du bei jedem Zugriff auf das USB-Teil brauchst.type octopus_context = packed record usb_handle : pointer; error_str : pchar; end; Poctopus_context = ^octopus_context; function octopus_init(var context: octopus_context): integer; external 'octopus.dll'; function octopus_open(context: octopus_context): integer; external 'octopus.dll'; var context:Poctopus_context; begin new(context); try if octopus_init(context) = 0 then raise Exception.Create(context.error_str); if octopus_open(context) < 0 then raise Exception.Create(context.error_str); finally dispose(context); end; end; Deshalb am besten auch Global deklarieren. Mit octopus_open übergibst du den Pointer der octopus.dll wieder. Wenn ich keinen falschen Fehler mache müßte das so ungefähr gehen. :? Ich weiß auch nicht genau ob man für den Pointer nicht erst Speicher reservieren muß. Nur mein Delphi ist halt noch nicht so gut. Wal |
Re: DLL einbinden octopus.dll
Zitat:
Hast du dir mal die Init-Routine angesehen?
Code:
Dort siehst du das der übergebene octopus-Zeiger nur dereferenziert wird, das würde schon mal nicht gehen, wenn kein Speicher dafür alloziert wäre. Hier wird also nur der reservierte Speicher initialisiert und kein Speicher reserviert und auch kein Zeiger zurückgeliefert. Es wird nur eine übergebene Speicheradresse initialisiert.
/*
* initial octopus handle before use octopus_open */ int octopus_init(struct octopus_context *octopus) { if (octopus == NULL) octopus_error_return(-1,"octopus not valid"); octopus->error_str = NULL; octopus->usb_handle = NULL; return 1; } |
Re: DLL einbinden octopus.dll
Also der Init läuft ja auch durch, egal ob usb_handle nun Pointer, Pchar oder sonst ein Zeiger ist ...
Aber octopus_open kommt mit error_str "can't set configuration for given usb device" zurück ... In der octopus.c steht :
Code:
und usb_set configuration ist in usb.h folgendermaßen deklariert :
/*
* open octopus with a libusb dev handle */ int octopus_open_dev(struct octopus_context *octopus, struct usb_device *dev) { if (octopus == NULL) octopus_error_return(-1,"octopus handle is wrong or missing"); if (dev == NULL) octopus_error_return(-2,"device handle is wrong or missing"); if (!(octopus->usb_handle = usb_open(dev))) octopus_error_return(-3,"can't open usb device"); if (usb_set_configuration (octopus->usb_handle,dev->config[0].bConfigurationValue) < 0) octopus_error_return(-4,"Ich can't set configuration for given usb device"); if (usb_claim_interface(octopus->usb_handle, 0) < 0) octopus_error_return(-5,"can't claim interface for given usb device"); if (usb_set_altinterface(octopus->usb_handle,0) < 0) octopus_error_return(-6,"can't set altinterface for given usb device"); return 1; }
Code:
int usb_set_configuration(usb_dev_handle *dev, int configuration);
|
Re: DLL einbinden octopus.dll
das struct usb_device sieht übrigens so aus in usb.h:
Code:
struct usb_device {
struct usb_device *next, *prev; char filename[LIBUSB_PATH_MAX]; struct usb_bus *bus; struct usb_device_descriptor descriptor; struct usb_config_descriptor *config; void *dev; /* Darwin support */ unsigned char devnum; unsigned char num_children; struct usb_device **children; }; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz