Delphi DLL

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: Delphi DLL

Beitrag von Rings »

man kann die dll runterladen,
das habe ich hier probiert (Alles ohne Fehler)
allerding auch keine Hardware dran:

Code: Alles auswählen

Prototype.l USB32IO_OpenDevice(Par1.l, Par2.s,Par3.s, Par4.s)
  
 Define.i hdll= OpenLibrary(#PB_Any,"USB32IO.dll")   
  If hdll   
    OpenDevice.USB32IO_OpenDevice = GetFunction(hdll, "OpenDevice")
  Else   
    MessageRequester("Error","Library Error")
  EndIf
 Debug OpenDevice.USB32IO_OpenDevice
  
  DevNum.b=20
  s0.s="EZUSB"
  s1.s=""
  s2.s=""
  
  DeviceID = CallFunction(hdll,"OpenDevice",@DevNum,@s0,@s1,@s2)   
  Debug DeviceID
  
  
  DeviceID = OpenDevice(@DevNum,s0,s1,s2)   
  Debug DeviceID
Rings hat geschrieben:ziert sich nich beim zitieren
Galahat
Beiträge: 21
Registriert: 26.11.2010 06:22

Re: Delphi DLL

Beitrag von Galahat »

@rings
Danke dir...Ja sicher klappt das..
Doch wenn ich die Hardware mit der ID 20 öffnen will, sollte diese sich mit (512+20) zurückmelden.
Diese sagt 0 -> nixxe da. Soweit war ich ja schon...mit und ohne und mitohne Zeiger. :freak:

@Joshi
Auch dir danke, nach kleinen Änderungen an deinem Code (IsFunction geht bei 4.40 wohl nicht), kam ich aber doch wieder an die gleiche Stelle...0. CallFunctionFast liefert jedoch ganz interassante Fehlermeldung.

Einmal schreit er : String wird erwartet, dann gebe ich ihm einen.
Dann meldet er: Zahl anstelle eines Strings erwartet. -> er will wohl einen Zeiger...
Dann kriegt er einen Zeiger .....Einmal schreit er : String wird erwartet..usw.

Ich werde nochmal verrückt.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Delphi DLL

Beitrag von ts-soft »

Galahat hat geschrieben:CallFunctionFast liefert jedoch ganz interassante Fehlermeldung.
Da gab es eine Änderung. Die Parameter sind nicht mehr vom Typ "Any" sondern vom Typ "Integer",
deshalb lassen sich Strings nur noch als Pointer übergeben (autom. Wandlung findet nicht mehr
statt).
Das ist aber auch garnicht so wichtig, weil Call... sollte man seit PB 4.0 garnicht mehr verwenden.
Gibts nur noch aus Kompatibilität mit alten Sourcen.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Galahat
Beiträge: 21
Registriert: 26.11.2010 06:22

Re: Delphi DLL

Beitrag von Galahat »

Und nun:
Demnach würde bei VB String der BSTR Datentype verwendet und bei Delphi der DELPHISTRING Datantype.

Was eigentlich so nicht sein kann weil der BSTR vom DELPHISTRING abweicht.

Aber aufgepast da in VB der String BYVAL übergeben wird und nicht BYREF
wird die Addresse des ersten Zeichens übergeben
(das ist nichts anderes als ein *pointer kann daher sogar in PB als long deklariert werden string.l)

Delphi erkennt vermutlich an der DLL/STDCALL Deklaration das ebenfals "nur" ein Zeiger auf das erste Zeichen erwartet wird.

Also übergebe die Addresse des ersten Zeichen es muss nur sichergestellt sein das
das letze Zeichem im String immer eine 0 ist sonst kann die DLL die Länge des Stringes nicht ermitteln.
:allright: :praise:

Ich habs gerade nochmal in meiner alten MSDN Library nachgelesen:

VisualBasic Strings sind vom Typ BSTR
Der Aufbau sieht so aus:

<Präfix><Zeichenfolge><Null> Zeichenfolge kann Nullzeichen enthalten
Header

Ein BSTR wird als Zeiger übergeben. Und nun kommts: Der Zeiger zeigt auf das erste Datenbyte, also auf das "Z" im Beispiel oben.
BSTR sind Unicode und enden mit 2Byte langen Nullzeichen.

Jetzt noch ne nette Ascii2Unicode Funktion, einen Zeiger an die richtige Stelle setzen, übergeben (wie man's nimmt) und fertig.

Trommelwirbel bitte..
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Delphi DLL

Beitrag von ts-soft »

Galahat hat geschrieben:Jetzt noch ne nette Ascii2Unicode Funktion, einen Zeiger an die richtige Stelle setzen, übergeben (wie man's nimmt) und fertig.

Trommelwirbel bitte..
Das entspricht aber einem normalem PB ASCII String, da brauchste nur Wandeln wenn Du als
Unicode kompilierst oder du nimmst:

Code: Alles auswählen

Prototype USB32IO_OpenDevice(Par1.l, Par2.p-ascii, Par3.p-ascii, Par4.p-ascii)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Galahat
Beiträge: 21
Registriert: 26.11.2010 06:22

Re: Delphi DLL

Beitrag von Galahat »

Au mann, wie ich es drehe und wende mit dem Bstr kram im Hinterkopf...ich komme immer wieder zu selben Ergebnis.
:roll:
Wie zum Geier gaukle ich denn der DLL einen sauberen VB-String vor.
Ich dolcht, ich hab noch nicht ganz kappiert wie ein PB-String aussieht, wenn ich ihn als Parameter übergebe.

Hier sieht man..ich stehe wieder ganz am Anfang.

Code: Alles auswählen

 Prototype.l USB32IO_OpenDevice(Par1.c, Par2.p-bstr, Par3.p-bstr, Par4.p-bstr)
  
  Define OpenDevice.USB32IO_OpenDevice  
 
  Define.i hdll= OpenLibrary(#PB_Any,"USB32IO.dll")    
  If hdll   
    OpenDevice = GetFunction(hdll, "OpenDevice") 
  Else    
    MessageRequester("Error","Library Error")
  EndIf
  
;#######################################################################################

  DevNum.c ;0 bis 31
  DeviceID.l    
  s0.s 
  s1.s
  s2.s

  s0="EZUSB"
  s1=""
  s2=""

DevNum = 20

DeviceID = OpenDevice(DevNum,s0,s1,s2)  
Debug "Device ID  "  + Str(DeviceID)      
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Delphi DLL

Beitrag von ts-soft »

Vergiß endlich .c und p-bstr. (p-bstr ist immer unicode!, und .c ist nich byvalue)

Code: Alles auswählen

EnableExplicit

Prototype USB32IO_OpenDevice(Par1.l, Par2.p-ascii, Par3.p-ascii, Par4.p-ascii)

Define OpenDevice.USB32IO_OpenDevice 

Define.i hdll= OpenLibrary(#PB_Any, "USB32IO.dll")   
If hdll   
  OpenDevice = GetFunction(hdll, "OpenDevice")
Else   
  MessageRequester("Error", "Library Error")
  End
EndIf

;#######################################################################################

Define DevNum.l ;0 bis 31
Define DeviceID.i   
Define.s s0, s1, s2

s0="EZUSB"
s1=""
s2=""

DevNum = 20

DeviceID = OpenDevice(DevNum, s0, s1, s2) 
Debug "Device ID  "  + Str(DeviceID)     
  
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Delphi DLL

Beitrag von mk-soft »

Verwendest warscheinlich die falsche DLL. Es gibt zwei verschiedene USB32IO.DLL.
Eine ist im Ordner "DRIVER" die warscheinlich die Richtige ist und die andere im Ordner Software die warscheinlich nur für VB oder Delphi ist.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Galahat
Beiträge: 21
Registriert: 26.11.2010 06:22

Re: Delphi DLL

Beitrag von Galahat »

@mk-soft: Nein, die DLL ist mittlererweile die Richtige. Blatter mal ein paar Posts zurück :D

@ts-soft

Bei deinem Bsp. gibts aber sofort mecker... mit DeviceID = OpenDevice(@DevNum, s0, s1, s2) ist er zufrieden.

Scheint aber alles so noch nicht zu stimmen.


Galahat
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Delphi DLL

Beitrag von ts-soft »

Dann machste aus Par1.l = Par1.b oder Par1.a, aber nicht .c
Der Rest sollte dann aber stimmen, sonst liegt der Fehler woanders, aber nicht im String.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten