Seite 2 von 5
Re: Delphi DLL
Verfasst: 29.11.2010 20:36
von ts-soft
@edel
Die macht aber nichts anderes, als mein erster Vorschlag, ausser das ich Integer verwendet habe,
was in diesem Falle ja unerheblich ist.
Re: Delphi DLL
Verfasst: 29.11.2010 20:47
von edel
Re: Delphi DLL
Verfasst: 29.11.2010 20:52
von ts-soft
edel hat geschrieben:
besser ist es
Auf dem ersten Blick wohl nicht sofort erkennbar

Re: Delphi DLL
Verfasst: 29.11.2010 20:54
von edel
Viel Spaß im Keller!

Re: Delphi DLL
Verfasst: 29.11.2010 22:41
von D.J.Peters
Nur um die Verwirrung zu komplimentieren,
ich hatte schon das Vergnügen mit PB DLL's für Delphi zu schreiben.
Grüsse
Joshy
Und ein "echter" Delphi String sieht so aus.
Code: Alles auswählen
Structure DELPHISTRING
RefCounter.l
StringSize.l
*pChars
EndStructure
Re: Delphi DLL
Verfasst: 30.11.2010 09:56
von Galahat
Also heissen Dank für Eure Hilfe bis hierher. Ich würde ja jetzt auch gerne so etwas sagen wie : "juhu es läuft", doch dazu brauchts wohl noch ein bisschen gefummel.
Ich verstehe das einfach nicht...
1. Ich komme nicht dahinter, wieso VB-declarationen mit String auskommen und andereseit in der Doku von einem String mit 4Byte-Längenangabe die Rede ist. Ich ignoriere das jetzt mal...
2. Will die DLL jeztz nun einen Zeiger auf meine Selbstgebauten Strings, oder schaffe ich es doch, eben diesen String ohne das er eingekürzt wird (wegen den NULLEN in der Längenangabe) zu übergeben?
Hoffentlich sitzt das Problem vor dem Rechner...
...Ungültiger Speicherzugriff.(Lesefehler an der Adresse ....)
Hier der letzte Versuch und Stand meiner Bemühungen:
Grüße Galahat
Code: Alles auswählen
Prototype.u USB32IO_OpenDevice(Par1.c, Par2.s, Par3.s, Par4.s)
Prototype USB32IO_CloseDevice(Par1.c)
;Funktionspointer
Global OpenDevice.USB32IO_OpenDevice
Global CloseDevice.USB32IO_CloseDevice
Define.i hdll= OpenLibrary(#PB_Any,"USB32IO.dll")
If hdll
OpenDevice = GetFunction(hdll, "OpenDevice")
Else
MessageRequester("Error","Library Error")
EndIf
;#####################################################################################
Global DeviceNumber.c ;0 bis 31
Global Devnum.c
Global DeviceError.i
Global DeviceID.u ;die auf der Karte gespeicherte ID 1024
Global CardID.u
Global *pTreiber.l
Global *pa.l
Global *pb.l
Global s1.s
Global s2.s
Global s3.s
Procedure ConvertStringToPascalDLL(AnsiString.s)
Protected len
Protected *mem.long
len = Len(AnsiString)
*mem = AllocateMemory(len + 5)
If *mem
PokeS(*mem + SizeOf(long), AnsiString)
*mem\l = len
ProcedureReturn *mem
EndIf
EndProcedure
*pTreiber = ConvertStringToPascalDLL("EZUSB")
*pa = ConvertStringToPascalDLL("")
*pb = ConvertStringToPascalDLL("")
s1=PeekS(*pTreiber,20)
s2=PeekS(*pa,20)
s3=PeekS(*pb,20)
FreeMemory(*pTreiber)
FreeMemory(*pa)
FreeMemory(*pb)
DeviceNumber = 255 ;ungültige DeviceNumber als Initialisierung
CardID = 1024 + 20 ; Kartenkennung + Kartennummer
Devnum = 20
DeviceID= OpenDevice(Devnum,s1,s2,s3)
If CardID = DeviceID
MessageRequester("Gefunden",Str(DeviceID))
EndIf
CloseDevice(Devnum)
Re: Delphi DLL
Verfasst: 30.11.2010 11:17
von ts-soft
Der Prototype wird eher so:
Code: Alles auswählen
Prototype USB32IO_OpenDevice(Par1, *Par2, *Par3, *Par4)
aussehen. Ganzzahlige Rückgaben, <= Integer werden auch so übergeben und nicht mit einem
kleinerem Typ. Dasselbe für den ersten Parameter. Und die anderen 3 sind in jedem Falle
Pointer zu dem String mit davorgebastelter Länge, siehe Beispiel edel oder meins, evtl. noch mit
vorgebasteltem Referencezähler (siehe D.J. Joshy)?
Gruß
Thomas
Re: Delphi DLL
Verfasst: 30.11.2010 14:32
von Galahat
so
Ich hab probiert die Prozedur umzufrickeln um dem Aufbau mit "Referenzzähler" etwas näher zu kommen.
Ich weiß nur nicht..muss der auf null oder..
Code: Alles auswählen
Procedure ConvertStringToDelphi(AnsiString.s)
Protected len
Protected *mem.l
len = Len(AnsiString)
*mem = AllocateMemory(len + 9)
If *mem
PokeS(*mem + SizeOf(long)+SizeOf(long), AnsiString)
PokeL(*mem + SizeOf(long),len)
PokeL(*mem,0) ;<----------------------------------------oder PokeL(*mem,[Longvar=0])
ProcedureReturn *mem
EndIf
EndProcedure
Galahat
Re: Delphi DLL
Verfasst: 30.11.2010 14:50
von ts-soft
Setz den Referenzzähler am besten auf -1 (konstanter String).
Ansonsten sollte Deine Procedure in Ordnung sein, vorausgesetzt Dein Code läuft im ASCII-Compilermode.
Gruß
Thomas
Re: Delphi DLL
Verfasst: 30.11.2010 15:06
von Galahat
Danke dir

, aber das isses auch noch nicht

.
Der Hund bleibt immer bei
DeviceID= OpenDevice(Devnum,*pTreiber,*pa,*pb) stehen und meldet :
Ungültiger speicherzugriff

Lesefehler an blablabla.
mmh
Ich schmeiß das ding gleich vorm Schneepflug