SnoopyDog Posted April 21, 2008 Share Posted April 21, 2008 (edited) Hallo forum. Da die Antwort auf diese PM auch allgemein interessant sein dürfte, hier eine öffentliche Antwort: Hallo!Da die SDK meiner Meinung nach leider teilweise recht dürftig ist, wollte ich mal anfragen, ob du mir evtl. ein wenig Code zur Verfügung stellen kannst welches die EventMsg Routine nutzt. Im Endeffekt fehlen mir ein paar Informationen, die ich so im Forum nicht finden konnte und die mir scheinbar auch leider niemand beantworten will. Vielleicht kannst du helfen: 1.) Wie kann ich im Plugin Notifies erhalten für STARTREC, STOPREC etc. ? 2.) Wie kann ich die OSD Funktionen nutzen (Stelle XYZ Text als OSD) dar? Ich danke. Für die Benachrichtigungs-API ist eigentlich der "dvbvspy" Quelltext eine gute Hilfe (hat mir gereicht), aber hier noch einmal ein beispielhafter Code. Man muß nicht alle Benachrichtigungsroutinen implementieren. Wenn etwas nicht gebraucht wird, einfach weglassen und nicht in "CreateDVBViewerClasses" damit verbinden: INTERFACE USES .... ActiveX, OleServer, DVBViewerServer_TLB; TYPE TfrmDemo = CLASS(TForm) PRIVATE { Private-Deklarationen } fConnected : BOOLEAN; DVBViewer : TDVBViewer; DVBViewerEvents : TDVBViewerEvents; DataManager : IDataManager; PROTECTED PROCEDURE DVBViewerEventAction(Sender: TObject; ActionID: INTEGER); PROCEDURE DVBViewerEventChannelChange(Sender: TObject; ChannelNr: INTEGER); PROCEDURE DVBViewerEventClose(Sender : TObject); PROCEDURE DVBViewerEventControlChange(ASender: TObject; WindowID,ControlID: INTEGER); PROCEDURE DVBViewerEventOSDWindow(ASender: TObject; WindowID: INTEGER); PROCEDURE DVBViewerEventPlaybackEnd(Sender: TObject); PROCEDURE DVBViewerEventPlaybackStart(Sender: TObject); PROCEDURE DVBViewerEventPlaystateChange(ASender: TObject; RendererType,State: TOleEnum); PROCEDURE DVBViewerEventRDS(Sender : TObject; CONST RDS : WIDESTRING); PROCEDURE DVBViewerEventSelectedItemChange(Sender: TObject); PROCEDURE SetConnected (Value : BOOLEAN); PRIVATE PROCEDURE CreateDVBViewerClasses; PROPERTY Connected : BOOLEAN READ fConnected WRITE SetConnected; PUBLIC { Public-Deklarationen } CONSTRUCTOR Create (aOwner : TComponent); OVERRIDE; DESTRUCTOR Destroy; OVERRIDE; END; IMPLEMENTATION // -------------------------------------------------------------------- // Irgendwo zum Initialisieren irgendwo die Property "Connected" setzen: // // Connected := TRUE; // // Zum Deinitialisieren: // // Connected := FALSE; // -------------------------------------------------------------------- CONSTRUCTOR TfrmDemo.Create (aOwner : TComponent); BEGIN INHERITED Create(aOwner); CreateDVBViewerClasses; END; { Create } DESTRUCTOR TfrmLCDDriver.Destroy; BEGIN Connected := FALSE; DVBViewerEvents.Free; DVBViewer.Free; INHERITED Destroy; END; { Destroy } PROCEDURE TfrmDemo.CreateDVBViewerClasses; BEGIN DVBViewer := TDVBViewer.Create(Self); DVBViewer.AutoQuit := FALSE; DVBViewer.AutoConnect := FALSE; DVBViewer.ConnectKind := ckRunningInstance; // DVBViewerEvents := TDVBViewerEvents.Create(self); DVBViewerEvents.AutoConnect := FALSE; DVBViewerEvents.ConnectKind := ckAttachToInterface; // DVBViewerEvents.OnAction := DVBViewerEventAction; DVBViewerEvents.OnChannelChange := DVBViewerEventChannelChange; DVBViewerEvents.OnDVBVClose := DVBViewerEventClose; DVBViewerEvents.OnControlChange := DVBViewerEventControlChange; DVBViewerEvents.OnOSDWindow := DVBViewerEventOSDWindow; DVBViewerEvents.OnPlaybackEnd := DVBViewerEventPlaybackEnd; DVBViewerEvents.OnPlaybackStart := DVBViewerEventPlaybackStart; DVBViewerEvents.OnPlaystateChange := DVBViewerEventPlaystateChange; DVBViewerEvents.OnRDS := DVBViewerEventRDS; DVBViewerEvents.OnSelectedItemChange := DVBViewerEventSelectedItemChange; END; { CreateDVBViewerClasses } PROCEDURE TfrmDemo.SetConnected (Value : BOOLEAN); // Stellt Verbindung zum DVBViewer her bzw. trennt sie wieder. VAR Something : IUnknown; BEGIN IF Value <> fConnected THEN BEGIN TRY IF Value THEN BEGIN // Einfache Abfrage, ob er läuft: GetActiveObject(CLASS_DVBViewer,NIL,Something); IF Something <> NIL THEN BEGIN // Er läuft: Verbinden. DVBViewer.Connect; DVBViewerEvents.ConnectTo(DVBViewer.Events); DataManager := DVBViewer.DataManager; fConnected := Value; END; { THEN } END { THEN } ELSE BEGIN DVBViewerEvents.Disconnect; DVBViewer.Disconnect; fConnected := Value; // // Kann evtl. auch entfallen. // DVBViewerEvents.Free; DVBViewer.Free; Sleep(1000); CreateDVBViewerClasses; // Bis hier. Bitte selbst probieren. END; { ELSE } EXCEPT IF NOT Value THEN fConnected := FALSE; END; END; { THEN } END; { SetConnected } // -------------------------------------------------------------------- // Event-Benachrichtigungsroutinen. // ACHTUNG: Code sollte keine allzulange Laufzeit haben, das bringt den // DVBViewer durcheinander. Beispiel: Schrittweises Debuggen. // Eigenen Code sicherheitshalber immer in // TRY // EigenerCode; // EXCEPT // Fehlerbehandlung; // END; // einfassen. // -------------------------------------------------------------------- PROCEDURE TfrmDemo.DVBViewerEventAction(Sender: TObject; ActionID: INTEGER); BEGIN // Wird bei vielen Events aufgerufen. END; { DVBViewerEventAction } PROCEDURE TfrmDemo.DVBViewerEventChannelChange(Sender: TObject; ChannelNr: INTEGER); BEGIN // Wird bei Kanalwechsel aufgerufen. END; PROCEDURE TfrmDemo.DVBViewerEventClose(Sender : TObject); BEGIN // Beenden. TRY Connected := FALSE; EXCEPT END; END; PROCEDURE TfrmDemo.DVBViewerEventControlChange(ASender: TObject; WindowID,ControlID: INTEGER); BEGIN // Aktives Control im OSD hat sich geändert. END; PROCEDURE TfrmDemo.DVBViewerEventOSDWindow(ASender: TObject; WindowID: INTEGER); BEGIN // OSD-Window-ID hat sich geändert. END; PROCEDURE TfrmDemo.DVBViewerEventPlaybackEnd(Sender: TObject); BEGIN // Playback Ende. END; PROCEDURE TfrmDemo.DVBViewerEventPlaybackStart(Sender: TObject); BEGIN // Playback start END; PROCEDURE TfrmDemo.DVBViewerEventPlaystateChange(ASender: TObject; RendererType,State: TOleEnum); BEGIN // Playback: Status geändert (Play => Pause, etc.) END; PROCEDURE TfrmDemo.DVBViewerEventRDS(Sender: TObject; CONST RDS : WIDESTRING); BEGIN // Radio: Neuer Radio-Text END; PROCEDURE TfrmDemo.DVBViewerEventSelectedItemChange(Sender: TObject); BEGIN // Selektiertes Element im OSD hat sich geändert. END; Um Text auf dem OSD auszugeben, beispielsweise DVBViewer.OSD.ShowInfoInTVPic(Msg,Timeout); aufrufen. Um Text "beliebig" lange auszugeben, einen extrem hohen Wert für "Timeout" übergeben, um den Text wieder verschwinden zulassen, denselben Text noch einmal mit Timeout = 10 . Leer darf der Text nicht sein! Nachtrag: Obigen Quelltext nochmal geändert. Und hier exemplarisch ein paar Konstanten, die man brauchen kann: CONST // ----------------------------------------------------------------------- EVENT_CHANNEL_UP = 9; EVENT_CHANNEL_DOWN = 8; EVENT_OSD_EXIT = 84; EVENT_OSD_UP = 78; EVENT_OSD_DOWN = 79; EVENT_OSD_LEFT = 2000; EVENT_OSD_RIGHT = 2100; EVENT_OSD_GREEN = 75; EVENT_OSD_YELLOW = 76; EVENT_VOLUME_CHANGE = 8251; EVENT_JUMP_BACK = 102; EVENT_JUMP_FORE = 103; EVENT_CHAPTER_BACK = 112; EVENT_CHAPTER_FORE = 113; EVENT_SPEED_UP = 12382; EVENT_SPEED_DOWN = 12383; EVENT_STOP = 114; // ----------------------------------------------------------------------- NO_OSD = -1; OSD_WIN_MUSIC = 5; OSD_WIN_MOVIES = 6; OSD_WIN_MINIEPG = 500; OSD_WIN_EPG_DETAIL = 501; OSD_WIN_RECORDINGS = 603; OSD_WIN_TELETEXT = 2000; OSD_WIN_PLAYLIST = 2004; OSD_WIN_PLAYBACK_STATUS = 2901; Quelltext nochmals geändert. Da war noch etwas zu spezielles drin... Edited April 21, 2008 by SnoopyDog Quote Link to comment
disaster Posted April 21, 2008 Share Posted April 21, 2008 Nur was macht man, wenn man zwei Instanzen nutzen will? Die COM Schnittstelle ist ja immer nur EINMAL registriert und selbst als .dll kann man leider intern nicht eine zweite COM nutzen :-( Quote Link to comment
SnoopyDog Posted April 21, 2008 Author Share Posted April 21, 2008 (edited) Das geht doch (?). Ich habe parallel dasselbe laufen. Einmal obiges als DLL im DVBViewer Plugins-Verzeichnis und gleichzeitig dasselbe als .EXE wenn ich es debuggen möchte. Läuft einwandfrei parallel... Edited April 21, 2008 by SnoopyDog Quote Link to comment
disaster Posted April 21, 2008 Share Posted April 21, 2008 Aha ich sehe einen Unterschied in deinem SetConnected holst du dir die klasse das mache ich momentan anders - das teste ich mal. Danke. Quote Link to comment
SnoopyDog Posted April 21, 2008 Author Share Posted April 21, 2008 Du meinst "GetActiveObject"? Das ist nur ein simpelster Test, ob der DVBViewer überhaupt läuft. Das worauf im Endeffekt zugegriffen wird, wird in "CreateDVBViewerClasses" initialisiert. Bei mir läuft allerdings ein Timer, der Anfangs versucht, "Connected" so lange zu setzen, bis es klappt. Oder man hat den richtigen Zeitpunkt (DVBViewer garantiert da), dann kann man das auch ohne Timer durchführen. Quote Link to comment
disaster Posted April 21, 2008 Share Posted April 21, 2008 Mhm also wenn ich zwei DVBViewer Instanzen laufen habe und in meinen .dlls einen DVBViewer.Connect durchführe, connecten BEIDE immer zur ersten Instanz. Quote Link to comment
SnoopyDog Posted April 21, 2008 Author Share Posted April 21, 2008 Ach, Du meinst zwei DVBViewer-Instanzen auf einem PC? Hatte Dich falsch verstanden. Wenn Lars mal reinschaut, kann er vielleicht etwas dazu sagen, denn ich habe das noch nicht probiert. Kann nur mit beiden Augen ein Fernsehprogramm verfolgen, zwei gleichzeitig sind mir zu viel ... Quote Link to comment
disaster Posted April 21, 2008 Share Posted April 21, 2008 Ja es ist wohl so, dass sich immer nur EINE COM Schnittstelle in Windows registrieren kann und leider geht es wohl auch nicht, dass sich eine DVBViewer und die andere als DVBVIEWER2 registriert. Neh die eine Instanz soll zum aufnehmen dienen. Der HTPC im Wohnzimmer dient zum gucken und zum recorden und ein anderer im Schlafzimmer nur zum gucken und ich will eine INSTANZ immer NUR zum Aufnehmen mit einer extra Karte verwenden. Quote Link to comment
SnoopyDog Posted April 21, 2008 Author Share Posted April 21, 2008 O.K. verstehe jetzt, warum Du 2 Instanzen laufen läßt. Kann man sich da irgendwie durchhangeln von Instanz zu Instanz? Ist nur die Frage, wie man sie auseinanderhält, falls es geht. Quote Link to comment
guinnes Posted September 13, 2008 Share Posted September 13, 2008 Danke, SnoopyDog, wieder was gelernt . ckAttachToInterface kannte ich noch gar nicht, ich habe immer versucht, DVBViewerEvents direkt zu connecten 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.