AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DLL-Aufruf verändert lokale Variable
Thema durchsuchen
Ansicht
Themen-Optionen

DLL-Aufruf verändert lokale Variable

Ein Thema von DelphiManiac · begonnen am 23. Jun 2009 · letzter Beitrag vom 24. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 15:57
Hallo,

ich bin am verzweifeln...

Ich nutzt LibUSB-win32 um mit Delphi auf ein USB-Gerät zuzugreifen.


Das klappt auch einigermaßen, die DLL kapselt den Zugriff auf das Device.

Ich rufe im Prinzip nur die DLL-Funktionen auf.

Beispiel:

Gerät suchen und Verbinden

Delphi-Quellcode:
    result := 1;

    usb_init;


    if usb_find_busses < 0 then
      showmessage('usb_find_busses() failed');

    noDev := usb_find_devices;
    if noDev < 0 then
    begin
      showmessage('usb_find_devices() failed')
    end
    else
    begin
      ShowMessage('No. of Devices = '+IntToStr(noDev));
    end;

    bus := usb_get_busses;

    if bus = Nil then
      showmessage('usb_get_busses() failed');

    while Assigned(bus) do
    begin
      dev := bus^.devices;
      while Assigned(dev) do
      begin

        if (dev.descriptor.idVendor = VENDORID) and (dev.descriptor.idProduct = PRODUCTID) then
        begin
// showmessage(string(dev.filename) + ' RTC gefunden!');

           usb_handle := usb_open(dev); // HIER wird mit dem Gerät Verbindung aufgenommen

          if usb_handle = Nil then
          begin
            showmessage('can''t open usb device');
            result := -1;
          end;

          if usb_set_configuration(usb_handle, dev.config[0].bConfigurationValue) < 0 then
          begin
            showmessage('can''t set configuration for given usb device');
            result := -1;
          end;

          if usb_claim_interface(usb_handle, 0) < 0 then
          begin
            showmessage('can''t claim interface for given usb device');
            result := -1;
          end;
{
          if usb_set_altinterface(usb_handle, 0) < 0 then
          begin
            showmessage('can''t set altinterface for given usb device');
            result := -1;
          end;
}

// ShowMessage(IntToStr(laenge));
          if result = -1 then showmessage('Error: octopus_open_dev');

          exit;
        end;

        dev := dev^.next;
      end;
      bus := bus^.next;
    end;
Wenn jetzt

usb_handle := usb_open(dev); aufgerufen wird, dann sehe ich wie eine lokale Variable (deklariert im Button.Click) ihren Wert den ich vorher initialisiert habe auf 492887 springt...

Wie kann denn der DLL-Aufruf meine Variable verändern,..???

Vielen Dank schonmal

DelphiManiac
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 16:16
Zitat:
dann sehe ich wie eine lokale Variable (deklariert im Button.Click) ihren Wert den ich vorher initialisiert habe auf 492887 springt...
Was für eine?
Markus Kinzler
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#3

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 16:25
Also kommt wohl nicht genau auf die Variable an, sondern auf die Adresse auf der da etwas passiert.
Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);
var
  eineVar:string;
 laenge:integer;
//device:pusb_device;
//messageVal:array [0..1]of byte ;
//answerVal: array[0..10] of byte;

buffer: packed array [0..1024] of char;
//res: PChar;//array[0..10] of char;
//zeiger :res;
aFan:RecFans;
aString:string;
sizeOfFan:Word;
  I: Integer;
begin

  // Hier wird laenge definiert //
  laenge := 11;
  sizeOfFan:= SizeOf(aFan);

  // in RTC_open_ID werden die DLL Funktionen aufgerufen
  RTC_open_id(VENDORID,PRODUCTID);
  // Hier stimmt laenge nicht mehr //
  ShowMessage('Länge: '+IntToStr(laenge));

        if usb_handle = Nil then
          begin
            showmessage('can''t open usb device');
            exit;
// result := -1;
          end;
  for I := 0 to 10 do
  begin
    usb_control_msg(usb_handle,UVC_In,7,3,0,buffer[0],11,1000);

  end;




  if usb_control_msg(usb_handle,UVC_In,7,3,0,buffer[0],11,1000) <0 then
  begin
    //se
    if usb_control_msg(usb_handle,UVC_In,7,3,0,buffer[0],11,1000) <0 then
    begin
      showmessage('Fehler control_message'+ usb_strerror());
    end
    else
    begin
      aString:=buffer;
      ShowMessage(aString);
    end;
  end
  else
  begin
      aString:=buffer;
      ShowMessage(aString);
  end;



  if usb_control_msg(usb_handle,UVC_In,2,0,0,aFan,sizeOfFan,1000) <0 then
  begin
    //se
    if usb_control_msg(usb_handle,UVC_In,2,0,0,aFan,SizeOf(aFan),1000) <0 then
    begin
      showmessage('Fehler control_message'+ usb_strerror());
    end
    else
    begin
      aString:=buffer;
// ^aFan:=buffer;
      ShowMessage(IntToStr(aFan.speed));
    end;
  end
  else
  begin
      aString:=buffer;
      ShowMessage(IntToStr(aFan.speed));
  end;

  if usb_control_msg(usb_handle,UVC_Out,3,80,1,buffer[0],0,1000) <0 then
  begin
  end
  else
  begin
      aString:=buffer;
      ShowMessage(IntToStr(aFan.speed));
  end;


end;

Delphi-Quellcode:
function RTC_open_id(vendor: integer; product: integer): integer;
var
  bus: pusb_bus;
  dev: pusb_device;
  noDev:Integer;
begin

  try

    result := 1;

    usb_init;


    if usb_find_busses < 0 then
      showmessage('usb_find_busses() failed');

    noDev := usb_find_devices;
    if noDev < 0 then
    begin
      showmessage('usb_find_devices() failed')
    end
    else
    begin
      ShowMessage('No. of Devices = '+IntToStr(noDev));
    end;

    bus := usb_get_busses;

    if bus = Nil then
      showmessage('usb_get_busses() failed');

    while Assigned(bus) do
    begin
      dev := bus^.devices;
      while Assigned(dev) do
      begin

        if (dev.descriptor.idVendor = VENDORID) and (dev.descriptor.idProduct = PRODUCTID) then
        begin
// showmessage(string(dev.filename) + ' RTC gefunden!');

           usb_handle := usb_open(dev);

          if usb_handle = Nil then
          begin
            showmessage('can''t open usb device');
            result := -1;
          end;

          if usb_set_configuration(usb_handle, dev.config[0].bConfigurationValue) < 0 then
          begin
            showmessage('can''t set configuration for given usb device');
            result := -1;
          end;

          if usb_claim_interface(usb_handle, 0) < 0 then
          begin
            showmessage('can''t claim interface for given usb device');
            result := -1;
          end;
{
          if usb_set_altinterface(usb_handle, 0) < 0 then
          begin
            showmessage('can''t set altinterface for given usb device');
            result := -1;
          end;
}

// ShowMessage(IntToStr(laenge));
          if result = -1 then showmessage('Error: octopus_open_dev');

          exit;
        end;

        dev := dev^.next;
      end;
      bus := bus^.next;
    end;

    if result = -1 then showmessage('could not found octopus device with pid and vid');

  except
    showmessage('Leider ein Fehler');
  end;
end;
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#4

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 16:26
Wie kann man denn soetwas debuggen?

Habe ich irgendwie die Möglichkeit mir da einen Dump vom RAM anzugucken?
Nutze BDS2006
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 16:41
Hallo,

Zitat:
Wie kann denn der DLL-Aufruf meine Variable verändern,..???
Du arbeitest hier mit Pointern, da kann es schnell passieren.

Zitat:
Wie kann man denn soetwas debuggen?
Woher hast du die DLL-Doku.
Welche Version benutzt du ?
Vielleicht sind die Datentypen nicht richtig definiert ?

# Update '
dev: pusb_device; ein Pointer ?

if (dev.descriptor.idVendor = VENDORID)
Wieso kannst du hier direkt auf descriptor zugreifen
es muss doch heissen dev^.descriptor.

Da stimmt doch was nicht ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.995 Beiträge
 
Delphi 12 Athens
 
#6

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 17:06
Zitat von hoika:
if (dev.descriptor.idVendor = VENDORID)
Wieso kannst du hier direkt auf descriptor zugreifen
es muss doch heissen dev^.descriptor.

Da stimmt doch was nicht ...
Doch, das ist unter Delphi möglich. Nennt sich "implizite Pointer-Dereferenzierung".
Uwe Raabe
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 17:09
Hall,

seit wann geht das denn ?
Wenn es eine Klasse wäre, ist das klar, ist doch aber ein record ...

wieder was dazugelernt


Heiko
Heiko
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#8

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 18:25
Hallo,

ich nutze die Version 0.1.12.1
von:
http://libusb-win32.sourceforge.net/

Doku
http://libusb.sourceforge.net/doc/

Wichtig als Info, ich nutze keinen Filter Treiber!

Vielleicht hat ja schoneinmal jemand hier ein Projekt mit LibUSB in Verbindung mit Delphi durchgeführt...

Das Beispielprojekt mit der Headerdatei habe ich hier irgendwo gefunden...

Kennt sich jemand aus mit der LibUSB??

Danke
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 19:53
Hallo,

zeig mal die Header-Datei.


Heiko
Heiko
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#10

Re: DLL-Aufruf verändert lokale Variable

  Alt 23. Jun 2009, 20:42
Anbei die LibUSB.pas mit der DLL Einbindung
Angehängte Dateien
Dateityp: pas libusb_170.pas (12,0 KB, 28x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:54 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