AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL einbinden octopus.dll

Offene Frage von "multi-man"
Ein Thema von multi-man · begonnen am 22. Jul 2008 · letzter Beitrag vom 5. Aug 2008
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: DLL einbinden octopus.dll

  Alt 24. Jul 2008, 10:23
Zitat von multi-man:
Speicher reserviert ? Wohl eher nicht
Aber hier mal der Code :
Delphi-Quellcode:
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';
Bei dir fehlen überall die Aufrufkonventionen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
multi-man

Registriert seit: 10. Jul 2008
16 Beiträge
 
Delphi 7 Professional
 
#12

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 02:41
Zitat von Luckie:
Zitat von multi-man:
Speicher reserviert ? Wohl eher nicht
Aber hier mal der Code :
Delphi-Quellcode:
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';
Bei dir fehlen überall die Aufrufkonventionen.
Danke, das ist mittlerweile behoben !


Zitat von omata:
Versuch es mal so...
Delphi-Quellcode:
type
  octopus_context = packed record
    usb_handle : integer;
    error_str : pchar;
  end;
  Poctopus_context = ^octopus_context;

function octopus_init(context: Poctopus_context): integer; stdcall; external 'octopus.dll';
function octopus_open(context: Poctopus_context): integer; stdcall; external 'octopus.dll';
Aufruf...
Delphi-Quellcode:
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;
Das Init läuft durch, beim Open erhalte ich die folgende Meldung: "could not found octopus device with pid and vid". Diese Meldung ist ja schonmal vielversprechend, ich habe ja auch kein Gerät. Aber es kommt eben auch keine Access Violation mehr.
Danke für den guten Ansatz, Init läuft durch mit 1 und open läuft auch durch ohne exception und mit returnwert 1, allerdings bekomme ich jetzt im error_str die Meldung "can't set configuration for given usb device" .

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
  Mit Zitat antworten Zitat
Wal

Registriert seit: 22. Sep 2006
57 Beiträge
 
#13

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 11:16
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:
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;
Den Delphi-Wrapper findest du hier: Delphi Header für LibUSB

Evtl. bringt dich das weiter.

Wal

P.S.
Luckie hat geschrieben:
Delphi-Quellcode:
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';
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.
Bin noch nicht der Delphifreak, deshalb berichtigt mich falls ich falsch liege.
  Mit Zitat antworten Zitat
multi-man

Registriert seit: 10. Jul 2008
16 Beiträge
 
Delphi 7 Professional
 
#14

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 16:34
Zitat von Wal:
Den Delphi-Wrapper findest du hier: Delphi Header für LibUSB

Evtl. bringt dich das weiter.

Wal
Leider nicht wirklich ..
Ich habe mal die LibUSB.pas mit in mein Testprogramm aufgenommen, aber leider passiert dabei das selbe ...

Chris
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 20:02
Zitat von Wal:
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.
Bin noch nicht der Delphifreak, deshalb berichtigt mich falls ich falsch liege.
Das ist so nicht. Den Speicherbereich muss man selber reservieren und dann übergibt man der Dll nur den Zeiger auf diese. Auf der Adresse kann dann die Dll arbeiten. Die Dll-Routine gibt also keinen Zeiger zurück, sondern arbeitet nur auf der übergebenen Speicheradresse. Somit ist hier kein Referenzparameter nötig. Das ist ja gerade der Witz an Zeigern und auch der Grund warum es in C keine Referenzparameter gibt.
  Mit Zitat antworten Zitat
multi-man

Registriert seit: 10. Jul 2008
16 Beiträge
 
Delphi 7 Professional
 
#16

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 20:08
Zitat von omata:
Zitat von Wal:
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.
Bin noch nicht der Delphifreak, deshalb berichtigt mich falls ich falsch liege.
Das ist so nicht. Den Speicherbereich muss man selber reservieren und dann übergibt man der Dll nur den Zeiger auf diese. Auf der Adresse kann dann die Dll arbeiten. Die Dll-Routine gibt also keinen Zeiger zurück, sondern arbeitet nur auf der übergebenen Speicheradresse. Somit ist hier kein Referenzparameter nötig. Das ist ja gerade der Witz an Zeigern und auch der Grund warum es in C keine Referenzparameter gibt.
Das stimmt !
  Mit Zitat antworten Zitat
Wal

Registriert seit: 22. Sep 2006
57 Beiträge
 
#17

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 20:11
Zitat von multi-man:
Zitat von Wal:
Den Delphi-Wrapper findest du hier: Delphi Header für LibUSB

Evtl. bringt dich das weiter.

Wal
Leider nicht wirklich ..
Ich habe mal die LibUSB.pas mit in mein Testprogramm aufgenommen, aber leider passiert dabei das selbe ...

Chris
Du hast mich falsch verstanden, du sollst den Header nicht einbinden. Sondern die Dateien vergleichen um die Variabeln-Typen herauszubekommen.

Meiner Meinung müßte das so gehen:

Delphi-Quellcode:

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;
Mit octopus_init bekommst du den Pointer auf das USB_Handle mitgeteilt, den du bei jedem Zugriff auf das USB-Teil brauchst.
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 20:20
Zitat von Wal:
Mit octopus_init bekommst du den Pointer auf das USB_Handle mitgeteilt, den du bei jedem Zugriff auf das USB-Teil brauchst.
Nein, sorry.

Hast du dir mal die Init-Routine angesehen?
Code:
/*
 * 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;
}
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.
  Mit Zitat antworten Zitat
multi-man

Registriert seit: 10. Jul 2008
16 Beiträge
 
Delphi 7 Professional
 
#19

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 20:35
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:
/*
 * 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;
}
und usb_set configuration ist in usb.h folgendermaßen deklariert :

Code:
  int usb_set_configuration(usb_dev_handle *dev, int configuration);
  Mit Zitat antworten Zitat
multi-man

Registriert seit: 10. Jul 2008
16 Beiträge
 
Delphi 7 Professional
 
#20

Re: DLL einbinden octopus.dll

  Alt 25. Jul 2008, 20:38
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;
};
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz