Jump to content

Scripts programmieren


schindi77

Recommended Posts

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 B)

Link to comment

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.

;)

Link to comment

B) 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 by schindi77
Link to comment

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.

Link to comment

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 ... ???

Link to comment

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

Link to comment

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.

Link to comment

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

Link to comment

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?

Link to comment

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

Link to comment

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 :)

Link to comment
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.

Link to comment

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.

Link to comment

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

Link to comment
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.... :)

Link to comment
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 ...

Link to comment

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! :blink: )

Denkbar wäre für mich auch, zusätzlich, die Events in den Datamanager zu schreiben, da man aus diesem ja Problemlos lesen kann.

:)

Link to comment
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 :)

Link to comment

Melde hiermit Interesse! :)

 

Das mit dem Class Manager werd ich dann mal versuchen, falls ich irgendwann mal wieder Zeit hab :D

 

Auf jeden Fall mal herzlichen Dank!

Link to comment

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

Link to comment

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 :)

Link to comment
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"

Link to comment
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" :bounce: Aber genug der Häme, was zählt ist schließlich das Ergebnis.

Link to comment
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!

Link to comment

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.

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...