Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL-Aufruf verändert lokale Variable (https://www.delphipraxis.net/136104-dll-aufruf-veraendert-lokale-variable.html)

DelphiManiac 23. Jun 2009 15:57


DLL-Aufruf verändert lokale Variable
 
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

Delphi-Quellcode:
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

mkinzler 23. Jun 2009 16:16

Re: DLL-Aufruf verändert lokale Variable
 
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?

DelphiManiac 23. Jun 2009 16:25

Re: DLL-Aufruf verändert lokale Variable
 
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;

DelphiManiac 23. Jun 2009 16:26

Re: DLL-Aufruf verändert lokale Variable
 
Wie kann man denn soetwas debuggen?

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

hoika 23. Jun 2009 16:41

Re: DLL-Aufruf verändert lokale Variable
 
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

Uwe Raabe 23. Jun 2009 17:06

Re: DLL-Aufruf verändert lokale Variable
 
Zitat:

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".

hoika 23. Jun 2009 17:09

Re: DLL-Aufruf verändert lokale Variable
 
Hall,

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

wieder was dazugelernt


Heiko

DelphiManiac 23. Jun 2009 18:25

Re: DLL-Aufruf verändert lokale Variable
 
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

hoika 23. Jun 2009 19:53

Re: DLL-Aufruf verändert lokale Variable
 
Hallo,

zeig mal die Header-Datei.


Heiko

DelphiManiac 23. Jun 2009 20:42

Re: DLL-Aufruf verändert lokale Variable
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei die LibUSB.pas mit der DLL Einbindung


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.
Seite 1 von 2  1 2      

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