Seite 2 von 3

Verfasst: 04.12.2008 00:05
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

Verfasst: 04.12.2008 00:14
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

Verfasst: 04.12.2008 00:51
von PMV
Hm, und wie soll das funktionieren?

Verfasst: 04.12.2008 01:28
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.

Verfasst: 04.12.2008 01:33
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

Verfasst: 04.12.2008 02:05
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

Verfasst: 04.12.2008 10:14
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

Verfasst: 04.12.2008 13:12
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?

Verfasst: 04.12.2008 13:55
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

Verfasst: 04.12.2008 18:00
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