COM-Objekt und die Datentypen.

  • Hey,

    sitze immernoch an einem Skript für den DVBViewer (TV-Software - in Delphi geschrieben).
    Folgendes soll gemacht werden: EPG-Daten von einem Sender holen und die gleichen Daten wieder setzen, nur für einen anderen Sender (der keine eigenen EPG-Daten hat).
    Soweit so gut - Hier mal der Link zum Gespräch mit dem Entwickler: http://www.dvbviewer.info/forum/index.php?showtopic=38502
    Und das Skript:

    Spoiler anzeigen
    [autoit]


    $DVBViewer = ObjGet("", "DVBViewerServer.DVBViewer");Verbindung aufbauen -> klappt
    If $DVBViewer = 0 Then; ohne Verbindung das Skript beenden
    MsgBox(1, "", "Keine Verbindung zum DVBViewer möglich")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $epg = $DVBViewer.EPGManager
    $get = $epg.Get(132,6 ,0,0)
    $count = $get.Count()
    $item = $get.Item(1)
    $add = $epg.addEPG
    $newitem = $add.newitem

    [/autoit] [autoit][/autoit] [autoit]

    with $item
    $charset = .Charset;
    $content = .Content;
    $Description = .Description;
    $duration = .Duration;
    $endtime = .EndTime;
    $EPGEventID = .EPGEventID;
    $Event = .Event;
    $EventID = .EventID;
    $serviceID = .ServiceID;
    $Time = .Time;
    $Title = .Title;
    $TransportID = .TransportID;
    ConsoleWrite(VarGetType($duration) & @CRLF)
    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    with $newitem
    .charset=$charset
    .content = $content
    .Description = $Description

    [/autoit] [autoit][/autoit] [autoit]

    .Duration=$duration ; -> TDateTime (Delphi spezifisch?) entspricht einer Fliesskommazahl (double)
    .time=$Time ; -> TDateTime entspricht einer Fliesskommazahl (double)
    .event=$Event
    .eventID=$EventID
    .title=$Title
    .EPGEventID=$EPGID ; EPGChannelID vom neuen Sender (hier eurosport)

    [/autoit] [autoit][/autoit] [autoit]

    EndWith

    [/autoit] [autoit][/autoit] [autoit]

    $add.add($newitem)
    $add.commit()

    [/autoit]


    Leider interpretiert Autoit die geholten Daten "falsch" und bei der Übergabe kommt ein Error (Request to Objekt failed oder so ähnlich)

    Das wieder zurechtzubiegen funktioniert nur teilweise:

    Spoiler anzeigen
    [autoit]


    with $item
    $duration = .Duration; -> $duration wird als String interpretiert
    $endtime = .EndTime; -> string ..
    $Time = .Time; -> string ..
    EndWith
    with $newitem
    .Duration=_WinAPI_IntToFloat(Number($Duration)); -> Geht nach der Wandlung von String to Int to Float
    .time=_WinAPI_IntToFloat(Number($time)); -> Error
    EndWith

    [/autoit]


    Sehr verwirrend ?(

    [autoit]

    $Newitem.Duration = $Item.Duration; ohne Zwischenschritt klappts auch nicht

    [/autoit]


    Vielleicht fällt euch ja noch was ein?

    Gruß nuts

    P.S. aus der COM-Doku:

    Spoiler anzeigen
    Code
    EPGChannelID; // Longword (unsigned int)
    EventID; // Longword (unsigned int)
    Time; // Datetime (Double)
    Duration; // Datetime (Double)
    Event; // String
    Title; // String
    Description; // String
    CharSet; // Byte
    Content; // Byte

    3 Mal editiert, zuletzt von nuts (9. Januar 2010 um 15:16)

  • Ich sehe in deinem Skript einige Methoden die als als Events bezeichnet werden, sinds es wirklich Methoden oder doch Events ?
    Events sollten ueber ObjEvent angesprochen werden. Solltest mal ueber Oleviewer eine IDL generieren und schauen wo was zu gehoert !!!
    PS. Der von dir gepostete Link ist fuer nicht angemeldete Benutzer nicht sichtbar.

    - MfG OpaEd

  • Hallo, danke für deine Antwort. Das mit dem Link stimmt :( lässt sich aber nicht ändern.
    Hier ein Auszug aus dem Gespräch:

    Spoiler anzeigen

    Ich frage mal ob man die Com-Doku hier anhängen kann.

    Der Code im Startpost ist überarbeitet, da einige Eigenschaften "readonly" sind und daher gar nicht funktionieren können. :whistling:

    edit \ bezüglich Methoden / Events: Mal schaun ob die Doku angehängt werden darf.
    Ist zielführender, da ich totaler Anfänger im objektorientierten Programmieren bin.

    edit2 \ Com-Doku angehängt

  • PS. Der von dir gepostete Link ist fuer nicht angemeldete Benutzer nicht sichtbar.

    Hallo, danke für deine Antwort. Das mit dem Link stimmt :( lässt sich aber nicht ändern.


    Das ist änderbar. Mit dem Firefox einfach den UserAgentSwitcher installieren und auf Googlebot umstellen :D Das wäre folgender Useragent:

    Code
    Googlebot/2.1 (+http://www.google.com/bot.html)
  • Hm? Der Forumbereich ist nur für Member.
    Hab den Firefox nicht installiert, aber wie muss ich den Link anpassen das jeder drauf zugreifen kann?


    Du kannst gar nichts machen. Der, der darauf zugreifen will, muss seinen UserAgent auf Googlebot stellen, da der Zugriff hat :D Beim Firefox geht das zum Beispiel mit diesem Addon

    Zum Thema: was kommt dabie raus?

    [autoit]

    Number($item.Duration)

    [/autoit]
  • Zitat

    ConsoleWrite(Number($item.Duration) & " " & VarGetType(Number($item.Duration)) &@CRLF) = 18991230004500 Int64


    edit \ vermutlich soll die Delphi Ausgabe von 18991230004500 das bedeuten: 0.004500 -> 45min im EPG (lt angezeigtem Sender EPG im Programm)
    1891230 hat irgendwas mit dem Delphiurknall zu tun.
    Die Objekte mit Daten zu füttern ist ein einziges Minenfeld. :(

    Mir ist durchaus bewusst, das Hilfe bei unbekannte, nicht testbaren Objekten schwierig ist.
    Solltet ihr Infos brauchen fragt einfach.

    2 Mal editiert, zuletzt von nuts (9. Januar 2010 um 13:45)

  • Zitat

    Ist zielführender, da ich totaler Anfänger im objektorientierten Programmieren bin.


    :whistling: Na ich bin Anfaenger in allen Programmier-Varianten.

    Zitat

    Leider interpretiert Autoit die geholten Daten "falsch" und bei der Übergabe kommt ein Error (Request to Objekt failed oder so ähnlich)


    Kann an falscher instanzierung liegen.

    Spoiler anzeigen
    [autoit]


    $DVBViewer = ObjGet("", "DVBViewerServer.DVBViewer"); Hier sprichst du Interface "DVBViewer" an
    If $DVBViewer = 0 Then; ohne Verbindung das Skript beenden
    MsgBox(1, "", "Keine Verbindung zum DVBViewer möglich")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;Fehlt hier nicht ein ObjGet oder ObjCreate zum Interface "EPGManager",
    ;ObjGet("", "DVBViewerServer.EPGManager")
    $epg = $DVBViewer.EPGManager
    $get = $epg.Get(132,6 ,0,0); weil Get Methode aus Interface EPGManager ist
    ;Fehlt hier nicht wieder ein ObjGet oder ObjCreate
    $count = $get.Count(); .Count() Interface IEPGCollection
    ;Fehlt hier nicht wieder ein ObjGet oder ObjCreate
    $item = $get.Item(1); Interface IFavoritesCollection
    $add = $epg.addEPG; Interface EPGManager
    ;Fehlt hier nicht wieder ein ObjGet oder ObjCreate
    $newitem = $add.newitem; Interface IEPGAddBuffer

    [/autoit]

    - MfG OpaEd

  • AutoIt wandelt den Datumstyp in einen String um. Diese Funktion sollte daraus wieder einen Double machen:

    [autoit]

    #include<Date.au3>
    Func _DateStringToDouble($sString)
    ; Author: Prog@ndy
    $sString = StringRegExp($sString, "^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$", 1)
    If @error Then Return SetError(2,0,0.0)
    Local $iDays = _DateToDayValue($sString[0], $sString[1], $sString[2])
    If @error Then Return SetError(1,0,0.0)
    $iDays -= 2415018.5 ; das Startdatum (30/12/1899) abziehen
    Local $iTimeInDays = $sString[3] /24 + $sString[4] /1440 + $sString[5] /86400 ;Die Zeit in Teile von Tagen umwandeln
    Return $iDays+$iTimeInDays
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, '', _DateStringToDouble("18991230004500"))

    [/autoit]
  • Wow ich glaubs nicht - es funktioniert :thumbup:
    Nicht nur die Umwandlung, sondern es wird tatsächlich ein EPG-Item erfolgreich erstellt 8)

    Tausend Dank, bastle schon 4 Tage an den paar Zeilen.

    opaed: Die Verbindung per ObjGet geht nur zu "DVBViewerServer.DVBViewer"
    Zu den untergordneten Methode lässt sich dann nur wie im meinem Skript eine Verbindung herstellen. ?(