Laden...

Mehr als ein Event löst Exception aus

Erstellt von MtiQS vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.961 Views
M
MtiQS Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren
Mehr als ein Event löst Exception aus

Hallo,

erst einmal ein herzliches Hallo in die Runde der C#-Entwickler, dies ist heute mein erster Beitrag bei Euch.

Ich bin eigentlich begeisterter Delphianer, habe aber nun ein C#-Projekt zur Implementation eines COM-Interface in eine NET-Assembly. Hier erst mal ein paar Fakten dazu:

Die Assembly ist Bestandteil einer NET-Anwendung und wird als Plugin benutzt. In dieser dll verweise ich auf ein COM-Interface welches aus eine WIN32-exe stammt. Soweit funktioniert das alles ganz ordentlich. Nur taucht nun Folgendes auf: Nachdem ich eine neue Instanz der COM-Klasse erzeugt habe implementiere ich das erste Event


this.MyMQS = new MQSComClass();
this.MyMQS.OnUTCDiff += new IMQSComEvents_OnUTCDiffEventHandler(MyMQS_OnUTCDiff);


void MyMQS_OnUTCDiff(int UTCDiff)
    {
        try
        {
            MessageBox.Show(UTCDiff.ToString());
        }
        catch
        {
            throw (new MQSException("Could not display UTC differece!"));
        }

    }

Wenn ich jetzt die Anwendung starte erhalte ich von meinem COM-Server die entsprechende Antwort und das Event wird ausgelöst. Soweit ok! Nun implementiere ich aber einen weiteren Eventhandler an einer anderen Stelle in der Klasse

this.MyMQS.OnSymbID += new IMQSComEvents_OnSymbIDEventHandler(MyMQS_OnSymbID);

sowie die zugehörige Routine um den Inputparameter des Events zu verarbeiten:


void MyMQS_OnSymbID(string SymbID)
    {
        try
        {
            string[] SyID = SymbID.Split(';');
            this.Symb2ID.Add(SyID[0], SyID[1]);
        }
        catch
        {
            throw (new MQSException("SymbolID " + SymbID + " could not processed!"));
        }
    }

Ab dem Moment wo ich nun die zwei Events habe wird das erste Event ganz normal gefeuert und anstelle des zweiten Event kommt immer die folgende Exception:

The service plugin RealTimeDataRetrieval threw an exception of type System.Runtime.InteropServices.COMException
bei RightEdge.Shared.ServiceWrapper.DoError(Exception e)
bei RightEdge.Shared.TickWrapper.StartWatching()
bei RightEdge.xfb471916970b0c9e.xe6866150eef6f995(String x16284292da96d0ba)
bei RightEdge.xfb471916970b0c9e.AddSymbol(SymbolSetup symbol)
bei RightEdge.xf266856f631ec016.x241715eb000ca8fc()
bei RightEdge.xf266856f631ec016.xa927fcc2ce303480(Object xe0292b9ed559da7d, EventArgs xfbf34718e704c6bc)
bei TD.SandBar.ToolbarItemBase.OnActivate()
bei TD.SandBar.ButtonItemBase.OnActivate()
bei TD.SandBar.
.(TopLevelMenuItemBase , Boolean , Boolean , Point )
bei TD.SandBar.TopLevelMenuItemBase.Show(Boolean select)
bei TD.SandBar.TopLevelMenuItemBase.Show()
bei TD.SandBar.ToolBar.OnItemPush(ToolbarItemBase item, Point position)
bei TD.SandBar.ToolBar.OnMouseDown(MouseEventArgs e)
bei TD.SandBar.MenuBar.OnMouseDown(MouseEventArgs e)
bei System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei TD.SandBar.ToolBar.WndProc(Message& m)
bei RightEdgeUI.CustomMenuBar.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Inner Exception:
An exception of type System.Runtime.InteropServices.COMException was thrown.
Ausnahme von HRESULT: 0x80040202
bei System.Runtime.InteropServices.ComTypes.IConnectionPoint.Advise(Object pUnkSink, Int32& pdwCookie)
bei MQS.IMQSComEvents_EventProvider.add_OnSymbID(IMQSComEvents_OnSymbIDEventHandler )
bei MQS.MQSComClass.add_OnSymbID(IMQSComEvents_OnSymbIDEventHandler )
bei RealTimeDataRetrieval.StartWatching()
bei RightEdge.Shared.TickWrapper.StartWatching()

Ich kann die beiden Eventhandler + Routinen nun wechselseitig auskommentieren und für sich allein funktionieren beide einwandfrei, nur eben nicht zusammen.

Mach ich da vielleicht was falsch? Wie gesagt, in C# bin ich absoluter Newbie. Vielleicht ist es ja nur eine Kleinigkeit.

Vielen Dank schon mal.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo MtiQS,

schau mal, ob InnerException gesetzt ist und mehr Aufschluss gibt.

herbivore

M
MtiQS Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren

Hallo herbivore,

danke erst mal für die prompte Reaktion.

In der Exception steht im letzten Drittel was von Inner Exception. Meinst Du das oder gibt es da noch mehr Details? Wenn ja, wo aktiviere ich diese Ausgabe bzw. wo finde ich die dann?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo MtiQS,

hm, ok, und gibt es noch eine InnerException der InnerException?

InnerException ist eine Property der Klasse Exception. Wenn du die Exception fängst (catch), kannst du auf InnerException zugreifen und z.B. ausgeben. Im Prinzip können InnerException beliebig tief geschachtelt sein. Die innerste gibt in der Regel das eigentliche Problem an. Die Interessiert natürlich am meisten.

herbivore

M
MtiQS Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren

Ja, ok. Dann muss ich erst mal suchen wo ich das catch dafür finde. Das ist nicht explizit von mir implementiert sondern muss wohl irgendwo anders in der Anwendung stecken.

Sollte ich die entsprechende Stelle nicht finden, welche Möglichkeiten gibt es dann noch dem Problem auf die Spur zu kommen? Die Events einzeln funktionieren ja, aber ich habe eben eine handvoll davon X(

4.221 Beiträge seit 2005
vor 16 Jahren

Wenn Du die Events in Delphi mit dem Designer erstellt hast, dann dürfte das Problem daran liegen ... hatte auch mal so ein Problem und deswegen recherchiert...

Der Designer in Delphi baut die Events irgendwie nicht sauber...

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
MtiQS Themenstarter:in
5 Beiträge seit 2007
vor 16 Jahren

Hallo,

ich habe die Ursache gefunden. Es liegt am Initialize des COMObjektes in Delphi. Der standardmässig generierte Rumpf

FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
      AutoFactory.EventIID, ckSingle, EventConnect)

muss gegen

FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
      AutoFactory.EventIID, ckMulti, EventConnect)

ausgetauscht werden. D.h. es muss TConnectionKind nicht als 'ckSingle' sondern als 'ckMulti' angegeben werden. Jetzt tritt der Fehler nicht mehr auf. 👍

Nun habe ich ein weiteres Problem bei der Geschichte. In einer kleinen Testanwendung rufe ich nun alle möglichen Events ab. Das funktioniert auch solange der Rüchgabewert sowas wie Integer oder String ist. Nun habe ich aber auch Events die einen packed Record zurückgeben. In diesen Fällen bleibt das Event ohne Reaktion. Hier die Deklaration in meiner Delphi-TLB:

  TRtRec = packed record
    SymbID: Integer;
    Mode: Shortint;
    Compression: Integer;
    isComplete: WordBool;
    UnixStart: Int64;
    UnixEnd: Int64;
    Open: Double;
    High: Double;
    Low: Double;
    Last: Double;
    Volume: Integer;
  end;

Gibt es bei Records oder packed Records zusätzlich noch was zu beachten in C#?

Vielen Dank schon mal!

183 Beiträge seit 2004
vor 16 Jahren

So einfach wie möglich, aber nicht einfacher. [Albert Einstein]

take a look at
* baer-torsten.de
* codinghints