schindi77 Posted April 3, 2009 Share Posted April 3, 2009 Hallo! Vorweg zur Erklärung: Ich habe (vor inzwischen etwa 15 Jahren, die Zeit vergeht), einige Jahre lang im privaten und schulischen Bereich C++/Basic/Pascal... programmiert, jedoch nur unter Dos. Daher sind mir die Grundzüge dieser Art zu programmieren, durchaus geläufig. Wie man daraus entnehmen kann, habe ich noch nie wirklich unter Windows programmiert. Nun habe ich aber gesehen, welche Möglichkeiten der DVBViewer (theoretisch, wenn man´s denn kann ) durch das Scripting bietet. Ich habe mich in der Zwischenzeit etwas mit der commands.vbs, der stoprec.vbs und der startrec.vbs beschäftigt, hier einige Dinge an meine Anforderungen angepaßt. Hat alles wunderbar geklappt. Was ich nun tun möchte, ist einfach verschiedene Events (bspw. addRecord oder div. OSD-Ereignisse) abzufangen, und daraufhin bestimmte Aufgaben ausführen. Mein Problem ist nun, daß ich bisher nicht mal weiß, wie ich ein (eigenes) Script überhaupt starten kann. Ich kämpfe mich schon seit einiger Zeit durch´s Forum, aber diese grundlegende Info habe ich bisher leider noch nichts gefunden. Sorry für diese noob-Fragen, aber ich hoffe, jemand kann mir eine kurze Einführung geben, einen kleinen schupps für den Start Quote Link to comment
Tüftler Posted April 3, 2009 Share Posted April 3, 2009 In diesem Beispiel siehst du wie die Pause.vbs gestartet wird. Hier wird das Script per command.vbs gestartet. Ich nutze das zur Zeit um den Playstate auszuwerten (Play oder Pause aktiv). Im übrigen würde es mich auf jeden Fall interessieren, wie man die Events per vbs abfragt. Wenn du es also hinbekommst, dann nur raus mit der Sprache. Ich hatte vor vielen Monden nur Basic Erfahrung auf der "Brotkiste", bist du mir also schonmal weit voraus. Quote Link to comment
schindi77 Posted April 3, 2009 Author Share Posted April 3, 2009 (edited) Noch viele Monde vor meiner C++ Zeit lernte ich mir selbst zuerst Basic auf der Brotkiste (da war ich ca. 12). Etwas später gings dann mit den ersten Assembler-Proggis auf der gleichen Brotkiste weiter (eine der ersten....). Seit damals ist aber schon einiges im Synapsen-Speicher wieder verloren gegangen... Zurück zum Thema: OK, in dem Beispiel wird also die pause.vbs durch die commands.vbs aufgerufen. Wenn ich mich jetzt richtig erinnere, wird die commands.vbs doch immer aufgerufen, sobald eine action mit id höher xxxxx aufgerufen wird, richtig? Da würde sich dann ja dann die windowload.vbs anbieten, um andere scirpte zu starten.... Auf jeden Fall mal herzlichen Dank, ist ja schon mal ein Anfang.... Edited April 3, 2009 by schindi77 Quote Link to comment
Tüftler Posted April 3, 2009 Share Posted April 3, 2009 Ja, das ist richtig. Die windowload.vbs ist denke ich schon am Besten, oder auch die channelchange.vbs, denn wenn man, wie ich, den Viewer mit dem zuletzt gesehenen Sender startet, wird diese auch sofort durchlaufen. Hier gibt es noch ein anderes Beispiel. Zu Assembler kam es bei mir nicht mehr, da gab es dann Irgendwann andere Interessen. Quote Link to comment
dbraner Posted April 3, 2009 Share Posted April 3, 2009 Um ein wenig Windows Programmierung wirst Du wahrscheinlich nicht rumkommen, wenn Du Events abfangen möchtest. Ich glaube nicht, dass das in VBS geht. Wenn man Microsft Visual Studio verwendet (das ist aber nicht billig) kann man sich fertige C++ Klassen für ein leichteres Handling des COM Interfaces vom DVBViewer automatisch generieren lassen. Das macht die C++ Programmierung sehr viel einfacher. Aber da wirst Du schon etwas Zeit investieren müssen. Wenn Dir allerdings die Events genügen, bei denen der DVBViewer die vordefinierten Scripts wie z.B. command.vbs aufruft, kannst Du bei VBS bleiben. Es gibt jedoch noch einige andere schöne Events, die z.B. auch Tüftler bei seinem Script geholfen hätten (z.B. Onplaystatechange). Aber geht eben nicht in VBS. Es sein denn, jemand weiß das besser ... ??? Quote Link to comment
JMS Posted April 4, 2009 Share Posted April 4, 2009 Theoretisch kann Scripting folgendes: wenn man ein globales Object X erzeugt, das ein Event OnY(Z) feuert, dann kann man im Script eine geeignete Methode X_OnY(Z) deklarieren, die das dann abfängt. Ich meine, ich hätte das mal hinbekommen, ist aber lange her. Sähe etwa so aus: Option Explicit Dim X Set X = CreateObject("Irgendwas.MitEvents") X.WerfeEvent Sub X_OnY(z) MsgBox z End Sub Wäre einen Versuch wert, oder? Jochen Quote Link to comment
nuts Posted April 4, 2009 Share Posted April 4, 2009 es wäre echt super wenn einer der könner ein kurzes, auskommentiertes beispiel (c, c++ oder was auch immer - hauptsache kein delphi) fürs eventhandling postet (einfache ausgabe des events als msgbox oder so). ich bekomme das nämlich auch nicht hin. Quote Link to comment
JMS Posted April 4, 2009 Share Posted April 4, 2009 Ok, hier die volle Wahrheit: Option Explicit Dim X Set X = CreateObject("Irgendwas.MitEvents") WScript.ConnectObject X, "X_" X.WerfeEvent Sub X_OnY(z) MsgBox z End Sub WScript.ConnectObject X, "X_" funktioniert aber nur, wenn das betroffene Objekte gewisse Regeln einhält, etwa IProvideClassInfo unterstützt. Das können nur die Entwickler sagen, ich habe leider keinen DVBViewer zur Hand. Aber wieder: einen Versuch wäre es wert! Jochen Quote Link to comment
nuts Posted April 4, 2009 Share Posted April 4, 2009 schade das du keinen DVBViewer zum testen hast. Set X = CreateObject("Irgendwas.MitEvents") diese zeile ist irgendwie der springende punkt ... was muss da wohl rein? die com interface erklärung ist mir in diesem punkt unklar. und noch ne frage: beim start des dvbviewers "createt" sich doch das objekt (DVBViewer com server) - wieso dann nochmal erstellen? Quote Link to comment
JMS Posted April 4, 2009 Share Posted April 4, 2009 In Deinem Fall würde das natürlich entfallen und einfach WScript.ConnectObject DVBViewer, "DVBViewer_" lauten (oder wie immer Deine Variable heißt, die Du über GetObject() gefüllt hast). ConnectObject geht dann hin und fragt das Objekt (den Viewer), welche Events angeboten werden. Sagen wir mal (keine Ahnung ob es das gibt) ein OnChannelChanged mit einem Parameter (mit dem Namen des Senders oder was weiß ich). Wenn es dann in Deinem Scriptcode eine Methode Sub DVBViewer_OnChannelChanged(arg) gibt, so wird das Event mit dieser verbunden. Das "DVBViewer_" Präfix kann beliebig gewählt werden, der zweite Parameter vom ConnectObject muss halt nur zum Präfix des Names Deiner Methode passen. Alles klar? Jochen Quote Link to comment
nuts Posted April 4, 2009 Share Posted April 4, 2009 theoretisch schon. ich möchte erstmal alle gesendeten events vom DVBViewer aufzeichnen können. der start wäre so: (skript in autoit - ist ja c++ "ähnlich") $test1 = ObjGet("", "DVBViewerServer.DVBViewer") $test2 = ObjEvent($test1, "Events_", "") und jetzt kommt der unklare punkt: wie gehts weiter Quote Link to comment
dbraner Posted April 5, 2009 Share Posted April 5, 2009 WScript.ConnectObject X, "X_" funktioniert aber nur, wenn das betroffene Objekte gewisse Regeln einhält, etwa IProvideClassInfo unterstützt. Das können nur die Entwickler sagen, ich habe leider keinen DVBViewer zur Hand. Aber wieder: einen Versuch wäre es wert! Jochen So, habe mal was probiert: Dim ObjDVBV set ObjDVBV = GetObject(, "DVBViewerServer.DVBViewer") ' ObjDVBV.SendCommand(45) WScript.ConnectObject ObjDVBV, "MyEvent_" Sub MyEvent_onAction (ActionId) MsgBox "Action" End Sub Produziert leider einen Fehler "Objekt wurde nicht verbunden". Das heißt dann wohl, das der DVBV die notwendigen Schnittstellen nicht bereitstellt, oder? Grundsätzlich funktioniert das Ansprechen des Com-Interfaces. Wenn ich bei der SendCommand Zeile den Kommentar entferne, wird umgeschaltet. Quote Link to comment
JMS Posted April 5, 2009 Share Posted April 5, 2009 Ja, ich befürchte, das heißt es. Schade Jochen Quote Link to comment
nuts Posted April 5, 2009 Share Posted April 5, 2009 so ists bei mir leider auch. den com server erreichen, z.b. über sendcommand funktioniert - die events anzuzeigen leider nicht. allerdings muss es irgendwie möglich sein, denn in eventghost funktionierts ja zum beispiel. Quote Link to comment
Tjod Posted April 5, 2009 Share Posted April 5, 2009 Alles was DVBViewer Spy anzeigt müsste gehen. Zu dem Tool gibt es ja auch den Quellcode aber das ist halt wieder Delphi. Quote Link to comment
ipforce Posted April 5, 2009 Share Posted April 5, 2009 Hi, die COM-Schnittstelle als normaler Client anzusprechen, wurde z.B. hier beschrieben. Events der COM-Schnittstelle abzufangen ist aus meiner Sicht erheblich komplexer. Selbst wenn man sich z.B. mit dem OLE/COM Object Viewer idl - Beschreibungen generieren lasst, ist der Zugriff mit C++ sehr umfangreich und nicht mit einem kurzen Code Snippet zu beschreiben. Z.b. kann ein Handler mittels ATL als COM ATL Event Sink implementiert werden. Darüber findest Du bei Google einige Beispiele, die Du Dir mal anschauen kannst. Moderner ist es sicher, solche Interfaces mit .Net zu implementieren, steht bei mir aber mangels Entwicklungsumgebung nicht zur Debatte. Grüsse, Andreas Quote Link to comment
schindi77 Posted April 6, 2009 Author Share Posted April 6, 2009 Um ein wenig Windows Programmierung wirst Du wahrscheinlich nicht rumkommen, wenn Du Events abfangen möchtest. Ich glaube nicht, dass das in VBS geht. Naja, hab ich kein Problem damit. Im Gegenteil, ich möchte sogar unbedingt etwas in die Windows-Programmierung einsteigen. Problem: Zeit! Wenn man Microsft Visual Studio verwendet (das ist aber nicht billig) kann man sich fertige C++ Klassen für ein leichteres Handling des COM Interfaces vom DVBViewer automatisch generieren lassen. Das macht die C++ Programmierung sehr viel einfacher. Aber da wirst Du schon etwas Zeit investieren müssen. Ich hab das MS Visual Studio 2005, allerdings die Express Edition, da gratis. Ist die grundsätzlich auch dazu geeignet? Ein bissale eingelesen und damit rumgespielt hab ich schon (vor Monaten...). Ach ja, man hätte soviel Freizeit, müßte man nicht arbeiten.... Quote Link to comment
dbraner Posted April 6, 2009 Share Posted April 6, 2009 Naja, hab ich kein Problem damit. Im Gegenteil, ich möchte sogar unbedingt etwas in die Windows-Programmierung einsteigen. Problem: Zeit!Ich hab das MS Visual Studio 2005, allerdings die Express Edition, da gratis. Ist die grundsätzlich auch dazu geeignet? Ein bissale eingelesen und damit rumgespielt hab ich schon (vor Monaten...). Ach ja, man hätte soviel Freizeit, müßte man nicht arbeiten.... Das mit der Freizeit ist auch mein Problem. Ich glaube, mit der Express Edition geht das nicht. Du kannst ja mal versuchen, über den Class Manager eine neue Klasse hinzuzufügen. Da müsste irgendne Frage kommen, ob eine Wrapper-Klasse für eine COMponent erstellt werden soll. Dann erscheint eine Liste mit allen Interfaces, die die auf Deinem PC installierten Programme (wie auch DVBViewer) so anbietet. Du machst dann einfach ein Häkchen vor den Schnittstellen, die Du haben möchtest. Den Rest macht dann Visual Studio. Ich habe schon überlegt ein kleines Programm in C++ zu schreiben, das (konfigurierbar) bestimmte Events des DVBViewers abfängt und als Reaktion vorher festgelegte Programme startet. Besteht grundsätzliches Interesse an sowas? Vielleicht habe ich ja über Ostern Langeweile ... Quote Link to comment
Tüftler Posted April 6, 2009 Share Posted April 6, 2009 Ja, dieses Interesse besteht auf jeden Fall. Ich hatte gehofft, von so einer Möglichkeit zu profitieren. Mir fehlt ebenfalls eindeutig die Zeit, mich in andere Programmiersprachen einzuarbeiten. (noch 1 Jahr Technikerstudium! ) Denkbar wäre für mich auch, zusätzlich, die Events in den Datamanager zu schreiben, da man aus diesem ja Problemlos lesen kann. Quote Link to comment
nuts Posted April 6, 2009 Share Posted April 6, 2009 Ich habe schon überlegt ein kleines Programm in C++ zu schreiben, das (konfigurierbar) bestimmte Events des DVBViewers abfängt und als Reaktion vorher festgelegte Programme startet. Besteht grundsätzliches Interesse an sowas? Vielleicht habe ich ja über Ostern Langeweile ... auf jeden fall! bitte mit quellcode Quote Link to comment
schindi77 Posted April 7, 2009 Author Share Posted April 7, 2009 Melde hiermit Interesse! Das mit dem Class Manager werd ich dann mal versuchen, falls ich irgendwann mal wieder Zeit hab Auf jeden Fall mal herzlichen Dank! Quote Link to comment
Thomasso Posted April 8, 2009 Share Posted April 8, 2009 Zugriff auf DVBViewer-Events in C#: dvb = (DVBViewer)System.Runtime.InteropServices.Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); dvb2 = dvb.Events; dvb2.OnChannelChange += new DVBViewerServer.IDVBViewerEvents_OnChannelChangeEventHandler(Events_OnChannelChange); bei auslösen des Events: protected virtual void Events_OnChannelChange(int ChannelNr) { //hier Code rein } Aber Zugriff auf Events sind so ziemlich die Basics, da sollte man sich besser einlesen sonst findet man sich eh nicht zurecht.... Gruß Thomas Quote Link to comment
dbraner Posted April 8, 2009 Share Posted April 8, 2009 Schön das das mit C# so einfach ist. Ich habe nun in Visual Studio 2 Wrapper-Klassen erzeugen lassen: CDVBViewer2 und CDVBViewerEvent. Mit Hilfe der Klasse CDVBViewer2 ist es möglich, z.B. mit der Methode SendCommand einen Befehlscode an den DVBViewer zu schicken. Das funktioniert also. Die Frage ist nur, wie ich über die Klasse CDVBViewerEvents diese Eventhandler zum Laufen bekomme. Diese Klasse hat für jeden Event eine Memberfunktion, z.B. onAction oder onPlaystateChange. Ich habe nun folgendes probiert: CDVBViewer2 MyDVBViewer (pIDispatch); // iDispatch = vorher initialisierter IDispatch Pointer CDVBViewerEvents MyEvents; MyEvents.AttachDispatch (MyDVBViewer.get_Event ()); Leider werden die Eventhandlerfunktionen jedoch niemals aufgerufen. Anzumerken ist noch, dass die Funktion get_Event() der Event() Methode im IDVBViewer Interface entspricht. Vielleicht kann ja einer der Entwickler mal versuchen, hier etwas Delphi Code zu posten (das ich mal freiwillig nach Delphi frage, hätte ich auch nicht gedacht Quote Link to comment
nuts Posted April 8, 2009 Share Posted April 8, 2009 Zugriff auf DVBViewer-Events in C#: dvb = (DVBViewer)System.Runtime.InteropServices.Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); dvb2 = dvb.Events; dvb2.OnChannelChange += new DVBViewerServer.IDVBViewerEvents_OnChannelChangeEventHandler(Events_OnChannelChange); bei auslösen des Events: protected virtual void Events_OnChannelChange(int ChannelNr) { //hier Code rein } Aber Zugriff auf Events sind so ziemlich die Basics, da sollte man sich besser einlesen sonst findet man sich eh nicht zurecht.... Gruß Thomas hast du das auch ausprobiert? weil das gleiche versuchen wir doch vom grundsatz her auch, nur eben in anderen sprachen. @dbraner vom dvbvspy gibt den quellcode in delphi aber diese sprache ist doch sehr "gewöhnungsbedürftig" Quote Link to comment
dbraner Posted April 9, 2009 Share Posted April 9, 2009 hast du das auch ausprobiert? weil das gleiche versuchen wir doch vom grundsatz her auch, nur eben in anderen sprachen. @dbraner vom dvbvspy gibt den quellcode in delphi aber diese sprache ist doch sehr "gewöhnungsbedürftig" Leider ist genau das folgende Konstrukt dvb2.OnChannelChange += new DVBViewerServer.IDVBViewerEvents_OnChannelChangeEventHandler in C++ nicht möglich, da der Operator += nicht überladen wird. Bei dem Statement oben wird ja im Prinzip die Adresse der Eventhandler-Funktion dem Objekt in der Eventklasse zugewiesen. In C++ gibt es in der Eventklasse jedoch nur echte Funktionen. Irgendwie muss man es COM mitteilen, dass es bei bestimmten Events eben diese Funktionen aufrufen soll. Delphi selbst hat sehr viel mit Pascal gemein. Da verweise ich dann immer auf den alten Usenet-Artikel "Real programmers don't use Pascal" Aber genug der Häme, was zählt ist schließlich das Ergebnis. Quote Link to comment
Thomasso Posted April 10, 2009 Share Posted April 10, 2009 hast du das auch ausprobiert? weil das gleiche versuchen wir doch vom grundsatz her auch, nur eben in anderen sprachen. Jupp das hab ich ausprobiert und das funktioniert einwandfrei! Quote Link to comment
dbraner Posted April 11, 2009 Share Posted April 11, 2009 Ich habe inzwischen einen Artikel bei Microsoft gefunden, in dem erklärt wird, wie man von einem Programm die Events eines anderen Programms abfängt (setzt allerdings MFC voraus): http://support.microsoft.com/default.aspx?...kb;en-us;181845 Nur leider funktioniert es nicht. Der Aufruf von AfxConnectionAdvise schlägt fehl. Ich frage mich nun, ob der DVBViewer überhaupt diese Connections unterstützt. Das können wohl nur die Entwickler beantworten. Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.