Plugins für meine App - Wie ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

scholly hat geschrieben:
Kiffi hat geschrieben:ähm, was war jetzt nochmal der Grund, warum Du keine DLL verwenden willst?
Wo hab ich das geschrieben?
geschrieben direkt nicht. Aber da Du mit keinem Wort auf die
DLL-Empfehlungen von NicTheQuick und PMV eingegangen bist und in
Deinem letzten Posting schriebst:
Dann geh ich den Weg über ein echtes Preference file
ging ich davon aus, dass diese Lösung für Dich nicht in Frage kommt.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Mir ging es ja die ganze Zeit nicht um die Form der Plugins, sondern wie diese von meiner App am unkompliziertesten zu nutzen sein könnten.

Und nachdem ihr mir das Clipboard erfolgreich ausgeredet habt :lol: , ist ein "echtes" Prefs-File wohl sowohl die einfachste, als auch flexibelste Lösung. IMHO.

bis denne...
scholly
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Hm, und wie soll das funktionieren?
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Mit stdin/out kann man sogar Binärdaten schicken, wenn man den Base64-En- und Decoder
auf beiden Seiten nutzt. Und es würde auch direkt unter Linux funktionieren.

Ansonsten kannst du auch die GlobalMemory-Library von Rings (glaube ich) nutzen, damit
sich dein Programm und das Plugin einen gemeinsamen Speicher teilen und darauf
operieren. Ansonsten gibt es noch benutzerdefinierbare Window-Messages und so ein
Kram.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

scholly hat geschrieben:Und nachdem ihr mir das Clipboard erfolgreich ausgeredet habt :lol: , ist ein "echtes" Prefs-File wohl sowohl die einfachste, als auch flexibelste Lösung. IMHO.
Kommunikation via Filesystem halte ich (wie PMV) für recht ungeeignet.
Beispielsweise: Wann liest die 'Mutterapplikation', wann schreibt das
Plugin (und umgekehrt)? Kommen sich beide Applikationen ins Gehege
und wollen zur selben Zeit in das Pref schreiben, dann ist der Ärger schon
vorprogrammiert.

Mein Lösungsvorschlag: Die Hauptapplikation kommuniziert mit dem
Plugin über eine einzige ProcedureDLL(). Ein Eingabeparameter, ein
Rückgabewert. Das war's.

vielleicht so (mit Strings):

Code: Alles auswählen

ProcedureDll.s Kommunikation(Input.s)
 [lala]
 ProcedureReturn Output.s
EndProc
denkbar wäre auch, wenn der Übergabe- und Returnparameter ein XML-Objekt ist.

Code: Alles auswählen

ProcedureDll Kommunikation(InputXml)
 [lala]
 ProcedureReturn OutputXml
EndProc
Halte ich persönlich für die einfachste und flexibelste Lösung.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Kiffi hat geschrieben:vielleicht so (mit Strings):

Code: Alles auswählen

ProcedureDll.s Kommunikation(Input.s)
 [lala]
 ProcedureReturn Output.s
EndProc
DLLs können keine Strings zurück geben, der Rückgabewert ist immer der
Zeiger auf den String, zumindest bei PB. Oder das war/ ist ein Bug aus der
PB4.20 ... ich zumindest konnte trotz Prototype.s keine direkten Strings
empfangen. Außerdem ist der Rückgabewert lediglich "read only" ... ein
verändern des zurückgegebenen Strings für zu IMAs ... und muss der
zurückgegebene String eine globale Variable sein, da der Speicherbereich
sonnst sofort nach dem Zurückgeben wieder freigegeben wird. Strings
sollten besser per Referenz (Zeiger) der Prozedur übergeben werden, die
ihr Ergebnis in den übergebenen String (Speicherbereich) schreibt. Dafür
wiederrum muss der String aber min. schon vor dem Aufruf so groß sein,
dass das Ergebnis dort hinein passt. Das wäre aber zumindest die
Methode, wie die meisten WinAPI-Funktionen arbeiten.

Code: Alles auswählen

ProcedureDLL.i Kommunikation(Input.s, *Output)
  Protected Daten.s
  [lala]
  If Not Daten : ProcedureReturn -1 : EndIf
  If *Output And Len(PeekS(*Output)) >= Len(Daten)
    PokeS(@Daten, *Output, (Len(Daten) + 1) * SizeOf(CHARACTER))
    ProcedureReturn #S_OK ; = 0
  Else
    ProcedureReturn Len(Daten)
  EndIf
EndProcedure
Deswegen hab ich scholly die Konsole vorgeschlagen :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

PMV hat geschrieben:DLLs können keine Strings zurück geben
:oops: War ja auch nur Pseudocode (dennoch -- und da gebe ich Dir recht --
sollte auch Pseudocode in den Grundzügen korrekt sein.)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Die Idee mit dem xml-object ist ja genial, das werde ich mir für die Zukunft merken!

:allright:

Sind da dann irgendwelche zwischensprachlichen Probleme zu erwarten?
Also kann ein mit PB, bzw. expat erstelltes Object einfach mit anderen Sprachen bearbeitet und zurückgegeben werden, oder eher weniger?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

HeX0R hat geschrieben:Sind da dann irgendwelche zwischensprachlichen Probleme zu erwarten?
puh, keine Ahnung. Habe ich noch nie ausprobiert. Wenn beide Sprachen
expat verwenden, wäre es mal einen Versuch wert. Wenn jedoch eine
Sprache kein expat verwenden sollte (beispielsweise MSXML) würde ich eher
davon abraten.

Spricht aber auch nix dagegen, wenn man XML-Strings austauscht. Mache
ich seit längerem für die Kommunikation Applikation <-> Webservice.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Ich hab das jetzte mal mit STDin/out versucht.

Diesen Code habe ich als "plugin.exe" für console:

Code: Alles auswählen

If OpenConsole()
  
  PrintN("data = start")
  PrintN("title = Das Schweigen der Lämmer")
  PrintN("otitle = The silence of the lambs")
  PrintN("year = 1990")
  PrintN("country = USA")
  PrintN("regie = Jonathan Demme")
  PrintN("mmactor = Anthony Hopkins")
  PrintN("mfactor = Jodie Foster")
  PrintN("fsk = 16")
  PrintN("len = 108")
  PrintN("type = feature movie")
  PrintN("genre = psycho-thriller")
  PrintN("data = end")
  Delay(5000)
  CloseConsole()
 EndIf
end
Wenn ich die "plugin.exe" starte, gibt er das auch brav in die Konsole aus.

Nun will ichs in meine App bekommen:

Code: Alles auswählen

If OpenWindow(0, 100, 200, 195, 260, "Plugin-test", #PB_Window_SystemMenu)

  hProcess = RunProgram("plugin.exe","Das Schweigen der Lämmer","",#PB_Program_Open|#PB_Program_Read)
  If hProcess
    Debug "jetzt sollte was kommen..."
    Repeat
      Debug ReadProgramString(hProcess)
    Until ProgramRunning(hProcess) = #False 
    CloseProgram(hProcess)
  EndIf
  
  Repeat
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf

  Until Quit = 1
  
EndIf

End 
Da kommt abba nur das erste Char einer Zeile an :(

Was mach ich flasch?

bis denne...
scholly
Zuletzt geändert von scholly am 04.12.2008 18:32, insgesamt 1-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Antworten