PurePerl »»» Implementierung von Perl in PB

Fragen zu allen anderen Programmiersprachen.
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

Beitrag von ts-soft »

>> Ich möchte auf die DLL Lösung eigentlich nur ungern zurückkommen, weil der Aufruf einer Funktion doch umständlicher ist, als sie direkt aufzurufen).

Es macht beim Funktionsaufruf keinen Unterschied, ob die Lib Importiert
wurde, oder die Funktionen mit prototypes belegt wurden. Normallerweise
steht alles in einer Include-Datei, sobald diese Includiert wurde stehen alle
Funktionen zur Verfügung (evtl. ist vorher noch eine Init-Funktion aufzurufen!

>> Ich könnte mich ja mal erkundigen, wie/wo es diese perl58.dll gibt.
Ich dachte eigentlich das auf Deinem Rechner Perl installiert wäre :freak:
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Ich dachte eigentlich das auf Deinem Rechner Perl installiert wäre
Die perl58.dll scheint aber nicht bei jeder Distrie dabei zu sein hab gestern 2
große packete geladen in der hofnung sie ist bei aber demm war nicht so.
Bei der Activestate distrie wurde ich fündig *g*
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

Beitrag von ts-soft »

>> Bei der Activestate distrie wurde ich fündig *g*
Ne andere Version, die Wndows voll unterstützt kenne ich nicht :mrgreen:

Im ScriptControl hab ich leider noch kein PerlScript zum laufen bekommen,
das wäre ja auch noch eine Notlösung.
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
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Es macht beim Funktionsaufruf keinen Unterschied, ob die Lib Importiert
> wurde, oder die Funktionen mit prototypes belegt wurden.
Soso, dafür gibt#s also Import und Pseudotype in PureBasic. Find ich gut, aber habe ich noch nie benutzt.


> Ich dachte eigentlich das auf Deinem Rechner Perl installiert wäre
War es auch mal, allerdings habe ich den nur als Interpreter genutzt, solange ich an meiner HP gebastelt habe. Momentan editiere ich meine Skripte direkt auf dem Server auf dem die HP liegt. Von daher brauche ich keine 300 MB Installation auf meiner Festplatte mehr.


> Bei der Activestate distrie wurde ich fündig
Heißt das jetzt, dass du schon was gefunden hast, was man in PB einbinden kann?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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

Beitrag von ts-soft »

AND51 hat geschrieben:> Bei der Activestate distrie wurde ich fündig
Heißt das jetzt, dass du schon was gefunden hast, was man in PB einbinden kann?
Die DLL, wie bereits vor zig Seiten erwähnt :freak:
Muß nun einer der Perl kennt, den Wrapper schreiben! Ich also nicht :mrgreen:
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Momentan editiere ich meine Skripte direkt auf dem Server auf dem die HP liegt.
Böse Böse Böse ! das macht man nicht der das haut nur unötig das error log voll :lol:
Heißt das jetzt, dass du schon was gefunden hast, was man in PB einbinden kann?
Naja hab auch nur die perl58.dll und perl.h bisher.

Allerdings hab ich mir mal die perl.h angeschaut so wie es scheint werden
darin weiter dateien includet die man dann ja auch wieder mit einbinden muß

Das wird auf jeden fall mal nicht gerade wenig arbeit ^^
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Die DLL, wie bereits vor zig Seiten erwähnt
OK, also die Lösung habe ich ja nun bereits verstanden.

> Naja hab auch nur die perl58.dll und perl.h bisher.
Ich weiß, ich bin wieder ein bisschen doof, aber was müssen wir denn machen? Welche Zutaten brauchen wir denn, um das Vorhaben zu realisieren und was sind das für welche?

*.h ist eine Header Datei, kann mir schon vorstellen, was das ist.
Wrapper ist das Ding, was es möglich macht, von PB aus auf die resourcen zuzugreifen.

Und was noch?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
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

Beitrag von ts-soft »

ts-soft hat geschrieben: Um Perl in PB zu integrieren gibts doch die Möglichkeit des embeded Perl.
Die DLL ist in Bin, die statische Lib in CORE, benötigte Header (embeded.h
Hauptsächlich) sind auch bei.
Es soll doch nicht neu compiliert werden, die DLL ist doch fertig :wink:
Du brauchste keine Header-Einbinden, die Header-Datei dient lediglich als
Beschreibung der Funktionen und ihrer Parameter (sehr wichtig!)
Eventuell sind noch Strukturen und Konstanten zu deklarieren, findet man
auch in den Headern (embeded.h oder so ähnlich)

Für die Lib mußte nur eine Import-Datei erstellen, siehe:
http://www.purebasic.fr/german/viewtopi ... b2pbimport
macht alles von alleine, nur CDECL ist einzustellen, sowie die Anzahl der
Parameter, die kann das Tool bei CDECL nicht ermitteln.

Um die Header zu verstehen, sind minimale C-Kenntnisse erforderlich,
aber die sind bei der Programmierung, IMHO, egal welche Sprache, fast
immer erforderlich.
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
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Beitrag von Nero »

Also wir haben uns das ganze etwas schwer gemacht ist mir aufgefallen :)


Habe mir mal die Dok vom ActiveState Perl durchgeschaut und hab auch etwas gefunden :mrgreen:

Und zwar ist alles möglich mit der PerlEz.dll

Das einzigste problem was ich damit habe ich weis nicht unter welcher
Liezens die läuft finde dahingehen auch nicht wirklich was.
Aber da Perl GNU ist hoffe ich mal ist es diese auch.

Habe mal kleinen Versuch mit dem StringField gemacht :lol:

Code: Alles auswählen

  Enumeration
   #Perl
  EndEnumeration


  Prototype.l PerlEzCreate(lpFileName, lpOptions);
  Prototype.l PerlEzDelete(hHandle);
  Prototype.l PerlEzCall4(hHandle, lpFunction, lpBuffer, dwBufSize,  lpFormat1, lpVoid1, lpVoid2, lpVoid3, lpVoid4);
  
  If OpenLibrary(#Perl, "PerlEz.dll") 
  
    PL_Create.PerlEzCreate       = GetFunction(#Perl, "PerlEzCreate")
    PL_Close.PerlEzDelete        = GetFunction(#Perl, "PerlEzDelete")
    PL_Call.PerlEzCall4          = GetFunction(#Perl, "PerlEzCall4")
     
  Else
    MessageRequester("Fehler", "PerlEz.dll konnte nicht geöffnet werden!")
  EndIf
  
  test_pl.s = "test.pl"
  
  
  plHandle.l = PL_Create(@test_pl,0)  


  *buffer = AllocateMemory(1024)
  
  function$ = "stringfield"           ; Die Sub die wir aufrufen wollen 
  format$ = "sssi"                    ; Die Parameter Formatierung
  
  text$ = "hallo ich bin der text"    ; param 1
  field$ = "2"                        ; param 2 
  seperator$ = "ich"                  ; param 3
  dump = 0                            ; param 4 <- der ist nur nötig weils keinen call mit 3 params gibt *g*
  
  Debug PL_Call(plHandle, @function$, *buffer, 1024,  @format$, @text$, @field$, @seperator$, @dump)
  Debug PeekS(*buffer)

  
  PL_Close(plHandle)  
  
  CloseLibrary(#Perl)
Man brauch aber nun noch die test.pl.
Da ist aber nur folgendes drinn

Code: Alles auswählen

#!
sub stringfield { return 0 || (split(("$_[2]"||" "), $_[0]))[$_[1] - 1] if($_[1]); }
Und man muß natürlich die PerlEz.dll aus dem Perl/bin/ ordner mit ins verzeichniss kopieren.

Das ganze könnte mann wen man es in Proceduren packt noch vereinfachen damit man nicht immer alle Parameter extra in variablen schreiben muß
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

Beitrag von ts-soft »

jetzt kopierste aus dem Core-Ordner noch die "PerlEz.lib" dazu und:

Code: Alles auswählen

; Import-File created by Lib2PBImport
; Libname: PerlEz.lib
; created: 2007/04/01  18:41

Import "PerlEz.lib"
  PerlEzCreate(a.l, b.l) As "_PerlEzCreate@8"
  PerlEzCreateOpt(a.l, b.l, c.l) As "_PerlEzCreateOpt@12"
  PerlEzDelete(a.l) As "_PerlEzDelete@4"
  PerlEzEvalString(a.l, b.l, c.l, d.l) As "_PerlEzEvalString@16"
  PerlEzCall1(a.l,b.l,c.l,d.l,e.l,f.l) As "_PerlEzCall1@24"
  PerlEzCall2(a.l,b.l,c.l,d.l,e.l,f.l,g.l) As "_PerlEzCall2@28"
  PerlEzCall4(a.l,b.l,c.l,d.l,e.l,f.l,g.l,h.l,i.l) As "_PerlEzCall4@36"
  PerlEzCall8(a.l,b.l,c.l,d.l,e.l,f.l,g.l,h.l,i.l,j.l,k.l,l.l,m.l) As "_PerlEzCall8@52"
  PerlEzCall() As "_PerlEzCall"
  PerlEzCallContext() As "_PerlEzCallContext"
  PerlEzSetMagicScalarFunctions(a.l, b.l,c.l) As "_PerlEzSetMagicScalarFunctions@12"
  PerlEzSetMagicScalarName(a.l ,b.l) As "_PerlEzSetMagicScalarName@8"
EndImport

; Test
test_pl.s = "test.pl"


plHandle.l = PerlEzCreate(@test_pl, 0)


*buffer = AllocateMemory(1024)

function$ = "stringfield"           ; Die Sub die wir aufrufen wollen
format$ = "sssi"                    ; Die Parameter Formatierung

text$ = "hallo ich bin der text"    ; param 1
field$ = "2"                        ; param 2
seperator$ = "ich"                  ; param 3
dump = 0                            ; param 4 <- der ist nur nötig weils keinen call mit 3 params gibt

Debug PerlEzCall4(plHandle, @function$, *buffer, 1024,  @format$, @text$, @field$, @seperator$, @dump)
Debug PeekS(*buffer)


PerlEzDelete(plHandle)
Auf Namensänderung auf PL_ hab ich verzichtet, kann man aber im
Importeil anpassen, ist dasselbe wie Prototype nur einfacher :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
Antworten