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
:praise:

Re: Delphi DLL

Verfasst: 29.11.2010 20:52
von ts-soft
edel hat geschrieben: :praise:
besser ist es :mrgreen:
Auf dem ersten Blick wohl nicht sofort erkennbar :wink:

Re: Delphi DLL

Verfasst: 29.11.2010 20:54
von edel
Viel Spaß im Keller! :lol:

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... :roll:

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 :cry:

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
:bluescreen:

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 :allright: , 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