OLE Automation

Hallo.

Ich hoffe ich bin hier in der richtigen Rubrik.

Ich versuche gerade mit Hilfe des OLE Automation Interfaces von VB.NET aus auf IP-Symcon zuzugreifen.

Leider finde ich weder in der Wiki, noch im Forum Infos zur OLE Schnittstelle.
Gibts es irgendwo eine Dokumentation zu den Befehlen oder ein paar Beispiele?

Ich hab jetzt einfach mal etwas rumprobiert, und es funktioniert eigentlich soweit ganz gut. Variablen setzen und abfragen, Skripte steuern, alles kein Problem, erkärt sich ja aus dem COM Objekt heraus weitgehend von selbst.

Nur beim registrieren von Events komme ich nicht weiter.

IPS.RegisterVariableEvent erwartet offenbar als Parameter den Namen der Variablen als String (kein Problem) und einen zweiten Parameter vom Type RVarEvent.

Rvarevent hat 3 Parameter:

.EventType

das ist klar, legt fest was auslöst

.Eventskript

ok, hier kann ich den Namen eines vorhandenen IP-Symcon scripts angeben, das klappt dann auch.

.EventTrigger

hier ist mein Problem. Ich nehme an das entweder .Eventskript oder .EventTrigger benutzt werden, evtl. geht auch beides, ist aber jetzt erst mal egal. .EventTrigger erwartet ein Object, und das wird dann wohl vom Event aufgerufen, aber was für eine Sorte Obejkt ist das? Welche Funktion muss dort vorhanden sein die dann aufgerufen werden kann?

Hat das schon mal wer unter .NET zum laufen bekommen (muss nicht VB.NET sein) und kann mir einen Tip geben?

Hier mal ein minimal Code der läuft (VB.NET 2005):

Dim ips As IPS.Environment
Dim tmp_event As New IPS.RVarEvent
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ips = GetObject(, „IPS.Environment“)
tmp_event.EventScript = „Temparatur_anzeigen“ ’ ein vorhandenes IP-Sym script
tmp_event.EventType = Global.IPS.EVarEventTypes.evtOnChange
ips.RegisterVariableEvent(„GZ_TEMP_IST“, tmp_event)End Sub

und hier mein Problem:

Dim ips As IPS.Environment
Dim tmp_event As New IPS.RVarEvent
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ips = GetObject(, „IPS.Environment“)
tmp_event.EventTrigger = me ’ meine eigene Form ? Ist ein Objekt aber wohl das falsche, oder es fehlt eine Funktion die aufgerufen werden soll.
tmp_event.EventType = Global.IPS.EVarEventTypes.evtOnChange
ips.RegisterVariableEvent(„GZ_TEMP_IST“, tmp_event)End Sub

gibt einen Fehler 0x80010105 (RPC_E_SERVERFAULT))

Danke

P.S.

wenn ich alles am laufen habe, kann ich gerne ein VB.net Beispielprogramm für die Wiki zur Verfügung stellen und da das COM Interface dann auch erklären.

Übrigens mit VB6 geht wohl mit dem COM Objekt fast nichts da Typen deklariert werden die zu VB6 nicht kompatbel sind, z.B. oben erwähntes RVarEvent.

Ich habe dir mal meine OLE Test Demo’s rangehängt. Da ist aucn ein mit C# dabei… das ist ja fast wie VB.NET :slight_smile:

EventTrigger ist wie unter PHP. Du musst einen Wert vom richtigen Typ übergeben. Bei OnChange/OnUpdate ist der Wert egal. Hauptsache der Typ stimmt. Interessant wird es bei den anderen Sachen. Bei OnValue gibt du das mit an, wann IPS Triggern soll. D.h du musst den Wert ja nach Variable nach Boolean, Int, Float, String casten.

Hier nochmal in PHP:


            RVarEvent varevent;
            varevent.EventScript = "test";
            varevent.EventType = EVarEventTypes.evtOnChange;
            varevent.EventTrigger = (int)5; //Hier muss der richtige Type angegeben werden!
            ipsenv.RegisterVariableEvent(lstVariables.SelectedItem.ToString(), varevent);

paresy

IPSOle.rar (57.2 KB)

Hallo paresy, vielen Dank für die Infos.

ja, VB und C# sind ziemlich ähnlich, drum mögens wohl weder die C++ noch die VB Programmierer.

Wie RegisterVariableEvent im Detail funktioniert ist mir jetzt klar. Es wirkt also immer als Auslöser für ein IPS internes Skript.

Leider komme ich damit meinem Ziel aber nicht näher.

Ich suche einen Weg um die Änderung einer Variablen an den OLE client zu melden.
Gibt es einen Weg damit der OLE server (IPS) einen Event and den OLE Client (mein .NET Programm) meldet, oder muss ich (mit einem Timer) ständig pollen und nachschauen ob es Änderungen gab?

Hallo ?

Gibt es einen Weg damit der OLE server (IPS) einen Event and den OLE Client (mein .NET Programm) meldet, oder muss ich (mit einem Timer) ständig pollen und nachschauen ob es Änderungen gab?

Danke!

Leider nein. Es ist zur Zeit auch nicht geplant die Schnittstelle mit Dispatchern dafür zu erweitern.

paresy