Seite 4 von 5
Re: Delphi DLL
Verfasst: 01.12.2010 15:29
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
Re: Delphi DLL
Verfasst: 01.12.2010 16:09
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.
@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.
Re: Delphi DLL
Verfasst: 01.12.2010 16:45
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
Re: Delphi DLL
Verfasst: 01.12.2010 16:49
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.
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..
Re: Delphi DLL
Verfasst: 01.12.2010 17:23
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)
Re: Delphi DLL
Verfasst: 01.12.2010 18:28
von Galahat
Au mann, wie ich es drehe und wende mit dem Bstr kram im Hinterkopf...ich komme immer wieder zu selben Ergebnis.
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)
Re: Delphi DLL
Verfasst: 01.12.2010 19:12
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)
Re: Delphi DLL
Verfasst: 01.12.2010 19:28
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

Re: Delphi DLL
Verfasst: 01.12.2010 19:43
von Galahat
@mk-soft: Nein, die DLL ist mittlererweile die Richtige. Blatter mal ein paar Posts zurück
@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
Re: Delphi DLL
Verfasst: 01.12.2010 19:50
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.