gema Posted August 12, 2004 Share Posted August 12, 2004 Hallo, gibt es eine Möglichkeit für ein externes Programm über SendMessage() an die aktuellen EPG Daten (lang Version) zu kommen? Danke, GeMa Quote Link to comment
Guest hackbart Posted August 12, 2004 Share Posted August 12, 2004 extern geht nicht, da Windows keine Zeiger von Programm zu Programm shared. Als Plugin kannste aber folgendes machen: const WM_DVBVIEWER = $B2C2; MSG_GETCOMPLETEEPG = $2216; type TEPGEntryStruct=packed record EventID:Word; Time:TDateTime; Duration:TDateTime; PresentFollowing:Byte; Event, Title, Description: PChar; Charset: Integer; Content: Byte; ServiceID: DWord; Frequency: DWord; end; TEPGStruct=packed record Count: Integer; Entries: Array of TEPGEntryStruct; end; PEPGStruct=^TEPGStruct; ... var EPG: TEPGStruct; ... EPG.Entries:=nil; SendMessage(DVBViewerHandle,WM_DVBVIEWER,MSG_GETCOMPLETEEPG, DWord(@EPG)); setlength(EPG.entries,EPG.Count); SendMessage(DVBViewerHandle,WM_DVBVIEWER,MSG_GETCOMPLETEEPG, DWord(@EPG)); und schon haste die Daten Christian Quote Link to comment
gema Posted August 13, 2004 Author Share Posted August 13, 2004 Danke, wie immer super, schneller Service! Quote Link to comment
gema Posted September 16, 2004 Author Share Posted September 16, 2004 Hi, hab nun mein erstes Plugin in C gebacken (Dank an erwin und Christian) und auch gleich die EPG-Info geladen: ging fast sofort bis auf SetAppHandle() wird nicht vom DVBViewer aufgerufen? Dann eben FindWindow(). Und die Menge an EPG-Daten ist gewaltig; gibt es vielleicht die Möglichkeit an die EPG Daten des aktuellen Senders, also das, was erscheint, wenn man auf die EPG-Info im laufenden Bild klickt? gema Quote Link to comment
Griga Posted September 16, 2004 Share Posted September 16, 2004 ging fast sofort bis auf SetAppHandle() wird nicht vom DVBViewer aufgerufen? Mit Sicherheit doch. Benutze ich in allen meinen Plugins, bislang ohne Probleme. Vielleicht ein kleiner Bug... die EPG Daten des aktuellen Senders ...lassen sich über die Service-ID zuordnen. Leider fehlt in der obigen Struktur die TransportStream ID (ein Designfehler), die für eine zuverlässigere Zuordnung zusätzlich erforderlich wäre. Diese wird zwar inzwischen auf mein Bestreben hin im DVBViewer erfasst, aber offenbar noch nicht weitergereicht. Die Frequenz, die anstattdessen geliefert wird, ist dagegen denkbar ungeeignet (noch ein Designfehler), da ein und der gleiche Kanal mit leicht abweichender Frequenz in der Kanalliste auftauchen kann. Wenn man sie verwendet, muss man "tolerant" testen, also z.B. auf ein Intervall von +/- 3 MHz. Zusätzlich ist dabei blöd, dass die EPG-Daten, die die ARD für das ZDF sendet, natürlich mit der Frequenz des ARD-Transponders erscheinen. Außerdem hat die ARD zwei Transponder. Es können also EPG-Einträge für die ARD-Programme mit zwei verschiedenen Frequenzen erscheinen..... usw. Am besten vergessen. Immer, wenn der DVBViewer auf einen Sender umschaltet, ruft er folgendes in allen Plugins auf: function Execute(ch: PTuner; Pid: PPluginPids): Boolean; stdcall; begin result:=false; //erlaubt die Senderumschaltung!!! //.... end; exports Execute; PTuner referenziert die Tuner-Struktur des betreffenden Senders mit den Daten, die du auch in der Kanalliste siehst (einschließlich Service-ID). Weiteres dazu in dem Channel Shortcutter-Sourcecode, der im Service Center erhältlich ist - er demonstriert auch, wie man die gesamte Kanalliste lädt, wodurch sich alle EPG-Daten Sendern zuordnen lassen. Den Pointer für die PluginPids kannst du erst mal ignorieren (d.h. einen untypisierten Zeiger einsetzen). Quote Link to comment
erwin Posted September 17, 2004 Share Posted September 17, 2004 ging fast sofort bis auf SetAppHandle() wird nicht vom DVBViewer aufgerufen? Ich habs so gemacht: void __stdcall SetAppHandle( int Handle, void * /* TRebuildFunc */RebuildFunc ) { _DVBHandle = ( HWND ) Handle; //bla bla } und es funzt. und auch gleich die EPG-Info geladen: Hast Du's so wie oben von Hackbart beschrieben gemacht? Wenn ja kannste dich ja revanchieren. Ich habs nicht hingekriegt. Irgendwie habe ich das dynamische Array von Delphi nicht richtig in eine passende C-Struct bekommen. Jedenfalls stürtzt es bei mir ab. Gruß erwin Quote Link to comment
Griga Posted September 17, 2004 Share Posted September 17, 2004 Irgendwie habe ich das dynamische Array von Delphi nicht richtig in eine passende C-Struct bekommen. Jedenfalls stürtzt es bei mir ab. Der häufigste Fehler bei der Übernahme von DVBViewer-Daten in Plugins ist, die begrenzte Gültigkeit der übergebenen Zeiger nicht ausreichend zu berücksichtigen. Insbesondere muss man alles, was als PChar kommt, *sofort* in Plugin-eigene Variablen kopieren. Später zeigen die womöglich sonstwohin... Quote Link to comment
gema Posted September 17, 2004 Author Share Posted September 17, 2004 Hi erwin, typedef struct { .... } TEPGEntryStruct; typedef struct { int Count; TEPGEntryStruct *Entries; } TEPGStruct; und dann in der Funktion: TEPGStruct EPG; EPG.Entries = NULL; EPG.Count = 0; SendMessage (DVBVHandle, WM_DVBVIEWER, MSG_GETCOMPLETEEPG, (long)&EPG); EPG.Entries = (TEPGEntryStruct *)malloc(EPG.Count * sizeof(TEPGEntryStruct)); SendMessage (DVBVHandle, WM_DVBVIEWER, MSG_GETCOMPLETEEPG, (long)&EPG); for (i = 0; i < EPG.Count; i++) { .... } free (EPG.Entries); Quote Link to comment
gema Posted September 17, 2004 Author Share Posted September 17, 2004 Ein kleines Problem hab ich noch, meine Structur sieht so aus: typedef struct { WORD EventID; LONG Time; LONG Duration; BYTE PresentFollowing; char *Event; char *Title; char *Description; int Charset; BYTE Content; DWORD ServiceID; DWORD Frequency; } TEPGEntryStruct; Damit stimmt die Größe (44 Byte) mit dem Überein was DVBViewer liefert. Ein Log der gelieferten Daten sieht so schlecht nicht aus, bis auf die Pointer Event, Title, Description. Verarbeite ich die Daten zu schnell? Vielleicht sonst einen Tip? Danke, gema EPG.count 742 EventID 4c9d Time acf9e38e Duration 1c7240e2 PresentFollowing c7 Event 48003fa1 Title 840145d4 Description 70014c8f Charset 1503a Content 0 ServiceID 6d66 Frequency 2eb2 EventID 4d96 Time ad160000 Duration 555540e2 PresentFollowing 55 Event 20003f95 Title f8030517 Description dc014ca5 Charset 3096c Content 0 ServiceID 6d66 Frequency 2eb2 .... und der Daten Dump in Hex: 00000000: 9d 4c e4 38 8e e3 f9 ac 00000008: e2 40 72 1c c7 71 1c c7 00000010: a1 3f 00 48 d4 45 01 84 00000018: 8f 4c 01 70 3a 50 01 00 00000020: 00 00 00 15 66 6d 00 00 00000028: b2 2e 00 00 96 4d 00 00 00000030: 00 00 16 ad e2 40 55 55 00000038: 55 55 55 55 95 3f 00 20 00000040: 17 05 03 f8 a5 4c 01 dc 00000048: 6c 09 03 00 00 00 00 22 00000050: 66 6d 00 00 b2 2e 00 00 00000058: ca 4d 56 55 55 55 f9 ac 00000060: e2 40 1c c7 71 1c c7 71 Quote Link to comment
Guest Lars_MQ Posted September 17, 2004 Share Posted September 17, 2004 typedef struct {WORD EventID; LONG Time; LONG Duration; [...] } TEPGEntryStruct; Ich weiss nicht ob das so richtig ist, die Time und Duration werden als TDateTime abgelegt, das ist ein Doublewert (float?) (8 byte), wenn long dem Longint (32 Bit/ 4 Byte) entspricht könnte das probleme geben... lars Quote Link to comment
erwin Posted September 20, 2004 Share Posted September 20, 2004 Erstmal Danke an alle. @Griga Dieser Tip ist sicher in allen DVB-Plugin-Fragen bedeutsam. Nun Ich habe einen Absturz mitten im Handling der zweiten Sendmessage(); Wahrscheinlich ist bei mir die Umsetzung der TEPGEntryStruct nach C falsch. @gema genau so hab ichs auch versucht, allerding mit anderer TEPGEntryStruct.: struct EPGEntryStruct { DWORD EventID; double Time; double Date; .... } Wenn Du für EventID ein WORD als Type hast und ich DWORD war ich an dieser Stelle vielleicht nur abgelenkt. Ich versuchts heut abend noch mal mit WORD. Genau wie Lars_MQ anmerkt war mir ein double für die Zeitwerte auch irgenwie passender. <ZITAT> The TDateTime type holds a date and time value. It is stored as a Double variable, with the date as the integral part, and time as fractional part. The date is stored as the number of days since 30 Dec 1899. </Zitat> erwin Quote Link to comment
gema Posted September 20, 2004 Author Share Posted September 20, 2004 Dein Absturz könnte davon kommen, daß du zuwenig Speicher reserviert hast. EPGEntryStruct muß 44 Bytes groß sein (hab ich ausgemessen). Wenn Du Visual Studio verwendest hilft ein #pragma pack(1) die Strukturelement hintereinander zu packen. Quote Link to comment
erwin Posted September 20, 2004 Share Posted September 20, 2004 (edited) Ja, denke schon das mein Patzer beim EventID-Datentyp solche Folgen haben kann. Und: #pragma pack(1) vergißt man auch allzuleicht wenn man C-Strukturen zur Fremdverarbeitung weitergibt. erwin PS: an die Delphi-Entwickler: Gibt es unter Delphi auch Packungs-Optionen für Strukturen und wie müssen diese dann für die Plugins eingestellt werden? Edited September 20, 2004 by erwin Quote Link to comment
Guest Lars_MQ Posted September 20, 2004 Share Posted September 20, 2004 (edited) Bei delphi sollten die records (=struct) mit TMeinRecord = packed record ... end; definiert werden, damit ist man auf der sicheren seite... Ansonsten gibt es für die Compileroptionen noch "Ausrichtung von Recordfeldern" dort ist bei mir für alle Sachen den DVBViewer betreffen die 4 eingestellt. Das ist historisch bedingt (DVBViewer wurde auf Delphi 4 erstellt und das konnte nur auf 4 ausrichten, daran halten sich auch die plugins, daher ist eine Umstellung eher schwierig). Ausgerichtete Record-Felder Richtet Elemente in Strukturen gemäß der angegebenen Anzahl von Bytes aus (1, 2, 4 oder 8). Wählen Sie den gewünschten Ausrichtungstyp in der Dropdown-Liste. Entspricht dem Schalter {$A}. Hinweis: In früheren Delphi-Versionen, konnte diese Option an- und ausgeschaltet werden. Auswahl 1 ist äquivalent zu Aus und 8 ist äquivalent zu An. gruss lars Edited September 20, 2004 by Lars_MQ Quote Link to comment
erwin Posted September 21, 2004 Share Posted September 21, 2004 Ansonsten gibt es für die Compileroptionen noch "Ausrichtung von Recordfeldern" dort ist bei mir für alle Sachen den DVBViewer betreffen die 4 eingestellt. Das ist historisch bedingt (DVBViewer wurde auf Delphi 4 erstellt und das konnte nur auf 4 ausrichten, daran halten sich auch die plugins, daher ist eine Umstellung eher schwierig). Dann wäre doch #pragma pack(1) eher falsch, denn das bedeuted unter C Ausrichten aufs Byte. Oder? mfG erwin Quote Link to comment
gema Posted September 21, 2004 Author Share Posted September 21, 2004 Hi, Bei mir geht jetzt das Auslesen der EPG, mit pack(1), und die Pointer Event, Title, Description zeigen auch auf Sinnvolles. typedef struct { WORD EventID; double Time; double Duration; BYTE PresentFollowing; char *Event; char *Title; char *Description; DWORD Charset; BYTE Content; DWORD ServiceID; DWORD Frequency; } TEPGEntryStruct; Quote Link to comment
erwin Posted September 21, 2004 Share Posted September 21, 2004 Hi,Bei mir geht jetzt das Auslesen der EPG, mit pack(1), und die Pointer Event, Title, Description zeigen auch auf Sinnvolles. Hi ! hab nach dieser Erfolgsmeldung nochmal nachgeschaut. Es bleibt tatsächlich bei #pragma pack(1) Die von Lars_MQ erwähnte 4-Byte-Ausrichtung von Delphi und der DVBViewer-Plugins wird natürlich durch das packed in TMeinRecord = packed record ... end; dominiert. mfG erwin 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.