Delphi DLL

Anfängerfragen zum Programmieren mit PureBasic.
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 »

@edel
Die macht aber nichts anderes, als mein erster Vorschlag, ausser das ich Integer verwendet habe,
was in diesem Falle ja unerheblich ist.
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
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Delphi DLL

Beitrag von edel »

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

edel hat geschrieben: :praise:
besser ist es :mrgreen:
Auf dem ersten Blick wohl nicht sofort erkennbar :wink:
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
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Delphi DLL

Beitrag von edel »

Viel Spaß im Keller! :lol:
D.J.Peters
Beiträge: 87
Registriert: 28.11.2010 13:07
Computerausstattung: P4 2x3.2GKz.1GB WIXP 32Bit NVIDEA GT240 1GB DDR3, AMD XP 1.8GHz Linux 32Bit NVIDEA GT240 TIi3200
Wohnort: Germany
Kontaktdaten:

Re: Delphi DLL

Beitrag 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
PS. meine vielen Fehler der Rechtschreibung auf dem Forum könnt Ihr gerne ignorieren.
Galahat
Beiträge: 21
Registriert: 26.11.2010 06:22

Re: Delphi DLL

Beitrag 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)
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 »

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
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 »

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
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 »

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
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 »

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
Antworten