![]() |
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
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 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