Seite 1 von 3

Plugins für meine App - Wie ?

Verfasst: 03.12.2008 19:58
von scholly
moin, moin...

Ich spiele mit dem Gedanken, meiner Video-DB eine Schnittstelle für Plugins zu spendieren, hab aber keinen Schimmer, ob/wie das mit PB zu realisieren wäre.

Es geht im Prinzip darum, daß meine App die Eingabe von Meta-Infos (Jahr, Herkunft, Regisseur, Genre und so'n Kram) von Hause aus nur manuell gestattet.
Wenn sich nun jemand die Arbeit machen will und für eine Internet-Quelle (IMDB, Allmovies etc.) ein "Auswertungs"-Plugin schreiben will, brauchts ja einen Weg, wie meine App das Plugin zur Arbeit veranlaßt und wie die gewonnen Daten in meine App kommen.

Bisher fallen mir eigentlich nur "externe DLL" und "zusätzliche Exe über STDin/STDout/STDerr" ein.

Da steh ich nun, ich armer Tor... ... aufm Schlauch :lol:

Kennt jemand irgendwas (Tutorial, Beispiel, Forum-Thread), wo ich mir entsprechendes Wissen anlesen könnte?

mDv...
scholly

Verfasst: 03.12.2008 20:24
von NicTheQuick
Ich würde es unter Windows mit einer DLL machen, die gewisse öffentliche Funktionen zur
Verfügung stellen muss, damit sie in deinem Programm funktioniert. Das sind dann
Callbacks, die du mit entsprechenden Daten füllst und sie erledigen den Rest und geben dir
die Daten zurück. Da kannst du dann auch eine Art Message-System einbauen wie mit den
Window-Events. Genauso muss die DLL entweder Zugriff auf die Datenbank oder das
einzelne Objekt bekommen oder dir zurückmelden, was du nun mit den ausgewerteten
Daten machen sollst.
Dabei musst du natürlich vorher festlegen, was das Plugin überhaupt alles machen darf.
Wäre ja blöd, wenn ein schlechtes Plugin auf einmal die Datenbank zerschießt.

Verfasst: 03.12.2008 20:29
von PMV
Ich habs mir von der Menge der Daten abhängig gemacht, ob ich die
Konsolen (stdin, stdout) nutze oder doch besser eine DLL.

Die Konsole hat den Vorteil, dass bei einem Fehler im Plugin nur das PlugIn
abstürzt und dein Hauptprogramm lediglich den Absturz des Programms
bemerkt. Wird in einer DLL aber z.B. ein IMA praktiziert, kann das gesamte
Programm abschmieren.

Die übergabe der Daten wird bei der Konsole durch einen vortlaufenden
Fluss an Daten realisiert, also ein Stream. Hm, das PB rohe Daten per
Konsole verarbeiten kann hatte ich bis grad eben wieder verdrängt ^_^
Ähnlich wie bei der Netzwerkkomunikation musst du dir also ein Protokoll
entwerfen, mit welchem du die Daten/ Befehle zwischen deiner Applikation
und dem PlugIn austauschen kannst.

Die DLL hingegen wird so genutzt wie deine eigenen Prozeduren. Du musst
dir hierfür also feste Prozedurnamen samt Parameter und Rückgabewerte
überlegen so wie natürlich die Aufgabe, die die jeweiliege Prozedur haben
soll.

Ansonnsten fällt mir nur ein, dass Konsolenprogramme ohne weiteres auch
auch auf Linux laufen sollten, während die DLLs natürlich in das
entsprechende Linuxformat kompiliert werden müssen, aber die EXE laufen
ja auch nicht ohne neu Kompilieren da drauf ... also kein wirklicher
unterschied.

Letzendlich liegt es also wohl an dir. Kommunikation per Dateistream oder
Prozeduren bzw. unabhängig von der stabilität des PlugIns oder davon
ausgehen, dass die PlugIns vernünftig funktionieren und keine schweren
Fehler produzieren.

Für dein Problem würde ich DLLs nehmen, wobei letzten endes eigentlich
nur ein Datenfluss entsteht ... weshalb vielleicht der Datenstream doch
besser sein könnte. Ach ja, Strings aus DLLs sind nicht so möglich, wie du
es bei deinen Prozeduren machst ... wenn ich mir überlege wie ich mich da
winden musste, bis ich ne nun ne entgültigke Lösung hatte für größere
Listen ... ich empfehle dir dann wohl doch besser die Konsole :D

Hm, du könntest ja mal nach "Protokoll" suchen ... die Konsolenbefehle
der Hilfe sind ansonnsten selbsterklärend. Wenn man erst mal den Sinn
verstanden hat sollte der Rest nicht mehr so schwer sein :wink:

MFG PMV

Verfasst: 03.12.2008 21:23
von scholly
Eigentlich soll so ein Plugin nur "beschaffen" dürfen.

Unkorrekt ausgedrückt:
"Füll mir diese Struktur und gib sie mir zurück."

Die gewonnenen Daten in dieser "Struktur" auszuwerten und in meine DB zu schreiben, bleibt Aufgabe meiner App.

Wäre das Clipboard nicht ein geeigneter Weg?
Sowohl eine Exe, als auch eine DLL könnten ein "Preference file" dort ablegen und meine App das mit simpelsten Mitteln auslesen.
Oder mach ich da einen Denkfehler?

Verfasst: 03.12.2008 21:56
von Kiffi
scholly hat geschrieben:Wäre das Clipboard nicht ein geeigneter Weg?
Bloß nicht! Das Clipboard sollte tunlichst nicht für solche Zwecke
missbraucht werden. Das CB brauche ich (als User) für meine
Copy & Paste Aktionen.

Grüße ... Kiffi

Verfasst: 03.12.2008 22:03
von PMV
Die Zwischenablage ist für den Benutzer gedacht und keine Schnittstelle
für Programme. :wink:

Für Windows gäbs übrigends noch "Pipes" als alternative :mrgreen:
Die kennen auch den Nachrichten Modus, wodurch der Datenfluss dort kein
Stream wäre :wink:
Pipes gibs sicher auch auf Linux, kenn ich mich aber nicht mit aus.

Für dein Problem denk ich aber mal, das stdin/ -out am besten geeignet
sind. Dein Protokoll würde auch sicher nix kompliziertes werden, schließlich
brauchst ja nur was wie "suche nach Autor xyz" und dann das Format,
wie die Antwort aussehen soll.

MFG PMV

Verfasst: 03.12.2008 22:55
von scholly
OK, dann kein Clipboard.

Dann geh ich den Weg über ein echtes Preference file, beziehe das in mein Konzept ein und nutze es noch für andere Zwecke.
Der Vorteil wäre dann auch, daß die "Form" des Plugins egal ist, Hauptsache es kann zwei Strings entgegennehmen und ein File schreiben.

Ach wenn es doch sowas schönes wie den guten, alten ARexx-Port auch außerhalb AOS geben würde :lol:

bis denne...
scholly

Verfasst: 03.12.2008 23:22
von Kiffi
@scholly: ähm, was war jetzt nochmal der Grund, warum Du keine DLL
verwenden willst?

Grüße ... Kiffi

Verfasst: 03.12.2008 23:57
von scholly
Kiffi hat geschrieben:ähm, was war jetzt nochmal der Grund, warum Du keine DLL verwenden willst?
Wo hab ich das geschrieben?
Ich werde versuchen, auch die Nutzung von DLLs als "PlugIn" zu ermöglichen.

Vielleicht habe ich mein Ziel nicht verständlich genug artikuliert:

Meine Video-DB speichert Infos zu archivierten Filmen:
- technische Infos (Medium-Typ, Codec(s), Bitrate(n), Auflösung, etc. pp)
- Meta-Infos (Titel, Serie, Universum, Genre, Typ, Quelle, Qualität, Regiseur, Artist, etc. pp)

Die Technischen Infos hol ich automatisch aus dem File.
Meta-Infos hole ich, soweit schon vorhanden, aus den Tags.

Fehlende Meta-Infos kann man eingeben.

Es gibt ein Programm (GCStar), das Plugins in PERL benutzt, um Movie-Sites wie IMDB und AllMivie abzuklappern und von dort weitere Meta-Infos zu besorgen.

Ich will solche Plugins weder schreiben noch mitliefern.
Ich will aber die Möglichkeit bieten, daß jemand, der Bock darauf hat, sich so ein Plugin zu basteln, die von diesem Plugin ersammelten Daten direkt in meine Eingabemaske übernehmen kann.
Wie so ein Plugin aussieht, soll mir egal sein - deswegen werde ich versuchen, so wenig Beschränkungen wie möglich einzubauen, Hauptsache es kann zwei Strings entgegennehmen und ein File mit festgelegtem Aufbau schreiben.

Besser erklärt?

bis denne...
scholly

Verfasst: 04.12.2008 00:04
von PMV
Also Dateien sind nicht für die Echtzeitkommunikation geeignet. Wenn du
wirklich eine verünftige Schnittstelle haben möchtest, sind DLL oder stdin/
out nötig. Und die Schnittstelle muss ja vermutlich garnicht so komplex
sein. Du könntest eine Prozedur nehmen, der du die zwei Strings übergibst
und welche dann das Suchen startet. Eine 2. Prozedur gibt den Status der
Suche zurück und eine weitere (oder mehrere) sind dann dafür zuständig,
dass Ergebnis der Suche zurück zu liefern.

Bei der Konsole sagst einfach, dass deine Applikation immer Befehle in der
Form <Befehl> "<Parameter1>" "<Parameter2>" sendest und als Rückgabe
machst ähnliche vorgaben.

:D

Ach ja ... du müsstest solche Vorgaben auch bei einer Datei machen. Dein
Programm muss ja schließlich wissen, welche Daten es bekommt.

MFG PMV