![]() |
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:
Wenn jetzt
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;
Delphi-Quellcode:
aufgerufen wird, dann sehe ich wie eine lokale Variable (deklariert im Button.Click) ihren Wert den ich vorher initialisiert habe auf 492887 springt...
usb_handle := usb_open(dev);
Wie kann denn der DLL-Aufruf meine Variable verändern,..??? Vielen Dank schonmal DelphiManiac |
Re: DLL-Aufruf verändert lokale Variable
Zitat:
|
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; |
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 |
Re: DLL-Aufruf verändert lokale Variable
Hallo,
Zitat:
Zitat:
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 |
Re: DLL-Aufruf verändert lokale Variable
Zitat:
|
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 |
Re: DLL-Aufruf verändert lokale Variable
Hallo,
ich nutze die Version 0.1.12.1 von: ![]() Doku ![]() 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 |
Re: DLL-Aufruf verändert lokale Variable
Hallo,
zeig mal die Header-Datei. Heiko |
Re: DLL-Aufruf verändert lokale Variable
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei die LibUSB.pas mit der DLL Einbindung
|
Re: DLL-Aufruf verändert lokale Variable
Hallo,
ja so eine ähnliche hatte ich nach langem Suchen auch gefunden. Benutz doch mal usb_set_debug(3) (nach dem usb_init). # Update: # Noch ein Link. Ist zwar C, sollte aber trotzdem lesbar sein. Wie man dort vor dem usb_open sieht, werden ein Haufen Sicherheitsabfragen vor dem open geamcht, u.A. der Test, ob das Gerät in Benutzung ist. ![]() Bei solchem DLL-Kram kannst du jetzt nur mit Code-Ausklammern anfangen. Mach den Code mal ganz einfach. Ich weiss, du sagst dir, die Stelle ist doch klar, aber Pointer-Problemen sind halt schwierig. Welche Version der USBLibExport.dll hast du eigentlich ? Unter folgendem Link steht eine weitere LibUSB (von 2006) mit einer kleinen Hilfsklasse. ![]() Ich würde die Klasse mal ausprobieren (nicht die ganze Unit, es wird auf eine andere DLL verwiesen). Die Klasse kapselt aber die usb_XXX Funktionen ein wenig. Heiko |
Re: DLL-Aufruf verändert lokale Variable
Hallo Heiko,
erstmal super vielen Dank für deine Antworten. Ich habe jetzt mal den Debugmode der DLL gestartet
Delphi-Quellcode:
Nach absenden meiner Control Message bekomme ich den Fehlercode -5
usb_set_debug(3)
--------------------------- Project1 --------------------------- usb_control_msg: sending control message failed, win error: Ein an das System angeschlossenes Gerät funktioniert nicht. --------------------------- OK --------------------------- Ist leider nicht sehr aussagekräftig, also der Connect funktioniert auch das Claim_Interface und das setzten der Konfiguration. Aber dann meckert er beim Senden, ich habe jetzt mal die Kapselung von Link 2 der französichen Seite genommen. P.S.: Ich greife direkt auf die libUSB0.dll zu, also nicht über eine Wrapper DLL... Vielleicht sollte ich das nochmal probieren... Gruß DM |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 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 by Thomas Breitkreuz