Announcement

Collapse
No announcement yet.

COM: Event wird nicht ausgelöst

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • COM: Event wird nicht ausgelöst

    Hallo zusammen,

    ich möchte die Klasse TCapiISDN von Dirk Rübenbach in VS2005 C# verwenden. Dazu habe ich mir gedacht, dass ich einen COM-Server erstelle, der die Methoden und Events der Klasse TCapiISDN anbietet.
    Zum testen habe ich für den Anfang erst einmal die Methode
    Connect(aController: Integer; aNumber: PChar) und das Event
    OnConnect(aConnectionID: Integer) gekapselt.
    Den Server registriert und in VS2005 eingebunden, kann ich mit
    Code:
                ISDNCapi_Peter.ISDNCapiClass test = new ISDNCapiClass();
                ISDNCapi_Peter.IISDNCapiEvents_SinkHelper mE = new IISDNCapiEvents_SinkHelper();
                test.OnISDNConnected += new IISDNCapiEvents_OnISDNConnectedEventHandler(test_OnISDNConnected);
                test.ISDNCall(1, "2914");
    auch die Rufnummer 2914 anrufen. Jedoch wird das Event beim erfolgreichen Connect nicht ausgelöst. Meines Erachtens liegt es aber auch nicht an der Schnittstelle, denn wenn ich im COM-Server selbst
    FCapi.Connect; auslöse, wird dies im Client unter VS2005 auch korrekt ausgelöst. Das Problem liegt also an dem internen Event der Klasse TCapiISDN. Das Event wird aber ausgelöst, wenn ich unter Delphi mit der Komponente arbeite (also nicht mit dem COM-Server).
    Hier der Delphi-Code:
    Implementierung:
    Code:
    unit CAPI_Impl;
    
    {$WARN SYMBOL_PLATFORM OFF}
    
    interface
    
    uses
      ComObj, ActiveX, AxCtrls, Classes, ISDNCapi_SIS_TLB, StdVcl, CAPIISDN;
    
    type
      TISDNCapi = class(TAutoObject, IConnectionPointContainer, IISDNCapi)
      private
        { Private-Deklarationen }
        FCapi: TCAPIISDN;
        FConnectionPoints: TConnectionPoints;
        FConnectionPoint: TConnectionPoint;
        FEvents: IISDNCapiEvents;
        { Hinweis: FEvents unterhält eine  *einzelne* Ereignissenke. Verwenden Sie
          für den Zugriff auf mehrere Ereignissenken FConnectionPoint.SinkList und
          durchlaufen Sie die Liste der Senken. }
      public
        procedure Initialize; override;
        procedure OnConnected(aConnectionID: Integer);
      protected
        { Protected-Deklarationen }
        property ConnectionPoints: TConnectionPoints read FConnectionPoints
          implements IConnectionPointContainer;
        procedure EventSinkChanged(const EventSink: IUnknown); override; 
        procedure ISDNCall(aController: Integer; aNumber: PChar); safecall;
      end;
    
    implementation
    
    uses ComServ;
    
    procedure TISDNCapi.EventSinkChanged(const EventSink: IUnknown);
    begin
      FEvents := EventSink as IISDNCapiEvents;
    end;
    
    procedure TISDNCapi.Initialize;
    begin
      inherited Initialize;
      FConnectionPoints := TConnectionPoints.Create(Self);
      if AutoFactory.EventTypeInfo <> nil then
        FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
          AutoFactory.EventIID, ckSingle, EventConnect)
      else FConnectionPoint := nil;
    end;
    
    
    procedure TISDNCapi.ISDNCall(aController: Integer; aNumber: PChar);
    begin
      FCapi:= TCAPIISDN.Create(nil);
      FCapi.OnConnect:= OnConnected;
      FCapi.connect(aController, aNumber);
      FCapi.OnConnect;
    end;
    
    procedure TISDNCapi.OnConnected(aConnectionID: Integer);
    begin
      if FEvents <> nil then FEvents.OnISDNConnected(aConnectionID);
    end;
    
    initialization
      TAutoObjectFactory.Create(ComServer, TISDNCapi, Class_ISDNCapi,
        ciMultiInstance, tmApartment);
    end.
    TLB:
    Code:
    unit ISDNCapi_SIS_TLB;
    
    // PASTLWTR : 1.2
    // Datei generiert am 16.11.2007 17:22:53 aus der unten beschriebenen Typbibliothek.
    
    // ************************************************************************  //
    // Typbib: C:\Program Files\Borland\Delphi7\Projects\ActiveX\CAPI\ISDNCapi_SIS.tlb (1)
    // LIBID: {C3549680-AF17-4A4A-86B3-F4FD20F89A73}
    // LCID: 0
    // Hilfedatei: 
    // Hilfe-String: ISDNCapi_SIS Bibliothek
    // DepndLst: 
    //   (1) v2.0 stdole, (C:\WINNT\system32\stdole2.tlb)
    //   (2) v4.0 StdVCL, (C:\WINNT\system32\stdvcl40.dll)
    // ************************************************************************ //
    {$TYPEDADDRESS OFF} // Unit muß ohne Typüberprüfung für Zeiger compiliert werden. 
    {$WARN SYMBOL_PLATFORM OFF}
    {$WRITEABLECONST ON}
    {$VARPROPSETTER ON}
    interface
    
    uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
      
    
    // *********************************************************************//
    // In dieser Typbibliothek deklarierte GUIDS . Es werden folgende         
    // Präfixe verwendet:                                                     
    //   Typbibliotheken     : LIBID_xxxx                                     
    //   CoClasses           : CLASS_xxxx                                     
    //   DISPInterfaces      : DIID_xxxx                                      
    //   Nicht-DISP-Schnittstellen: IID_xxxx                                       
    // *********************************************************************//
    const
      // Haupt- und Nebenversionen der Typbibliothek
      ISDNCapi_SISMajorVersion = 1;
      ISDNCapi_SISMinorVersion = 0;
    
      LIBID_ISDNCapi_SIS: TGUID = '{C3549680-AF17-4A4A-86B3-F4FD20F89A73}';
    
      IID_IISDNCapi: TGUID = '{DB2B0308-298D-4228-80A2-B519D33E08C5}';
      DIID_IISDNCapiEvents: TGUID = '{509015DA-A1D6-4702-9D52-9124D16A5E0D}';
      CLASS_ISDNCapi: TGUID = '{E7CA49A0-BAA2-4AF7-A6E9-103ED3FEC1C2}';
    type
    
    // *********************************************************************//
    // Forward-Deklaration von in der Typbibliothek definierten Typen         
    // *********************************************************************//
      IISDNCapi = interface;
      IISDNCapiDisp = dispinterface;
      IISDNCapiEvents = dispinterface;
    
    // *********************************************************************//
    // Deklaration von in der Typbibliothek definierten CoClasses             
    // (HINWEIS: Hier wird jede CoClass zu ihrer Standardschnittstelle        
    // zugewiesen)                                                            
    // *********************************************************************//
      ISDNCapi = IISDNCapi;
    
    
    // *********************************************************************//
    // Schnittstelle: IISDNCapi
    // Flags:     (4416) Dual OleAutomation Dispatchable
    // GUID:      {DB2B0308-298D-4228-80A2-B519D33E08C5}
    // *********************************************************************//
      IISDNCapi = interface(IDispatch)
        ['{DB2B0308-298D-4228-80A2-B519D33E08C5}']
        procedure ISDNCall(aController: Integer; aNumber: PChar); safecall;
      end;
    
    // *********************************************************************//
    // DispIntf:  IISDNCapiDisp
    // Flags:     (4416) Dual OleAutomation Dispatchable
    // GUID:      {DB2B0308-298D-4228-80A2-B519D33E08C5}
    // *********************************************************************//
      IISDNCapiDisp = dispinterface
        ['{DB2B0308-298D-4228-80A2-B519D33E08C5}']
        procedure ISDNCall(aController: Integer; aNumber: {??PChar}OleVariant); dispid 201;
      end;
    
    // *********************************************************************//
    // DispIntf:  IISDNCapiEvents
    // Flags:     (0)
    // GUID:      {509015DA-A1D6-4702-9D52-9124D16A5E0D}
    // *********************************************************************//
      IISDNCapiEvents = dispinterface
        ['{509015DA-A1D6-4702-9D52-9124D16A5E0D}']
        procedure OnISDNConnected(aConnectionID: Integer); dispid 201;
      end;
    
    // *********************************************************************//
    // Die Klasse CoISDNCapi stellt die Methoden Create und CreateRemote zur      
    // Verfügung, um Instanzen der Standardschnittstelle IISDNCapi, dargestellt von
    // CoClass ISDNCapi, zu erzeugen. Diese Funktionen können                     
    // von einem Client verwendet werden, der die CoClasses automatisieren    
    // möchte, die von dieser Typbibliothek dargestellt werden.               
    // *********************************************************************//
      CoISDNCapi = class
        class function Create: IISDNCapi;
        class function CreateRemote(const MachineName: string): IISDNCapi;
      end;
    
    implementation
    
    uses ComObj;
    
    class function CoISDNCapi.Create: IISDNCapi;
    begin
      Result := CreateComObject(CLASS_ISDNCapi) as IISDNCapi;
    end;
    
    class function CoISDNCapi.CreateRemote(const MachineName: string): IISDNCapi;
    begin
      Result := CreateRemoteComObject(MachineName, CLASS_ISDNCapi) as IISDNCapi;
    end;
    
    end.
    und hier der C#-Code

    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using ISDNCapi_Peter;
    
    namespace DLL
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                ISDNCapi_SIS.ISDNCapiClass test = new ISDNCapiClass();
                ISDNCapi_SIS.IISDNCapiEvents_SinkHelper mE = new IISDNCapiEvents_SinkHelper();
                test.OnISDNConnected += new IISDNCapiEvents_OnISDNConnectedEventHandler(test_OnISDNConnected);
                test.ISDNCall(1, "2914");
            }
    
            void test_OnISDNConnected(int aConnectionID)
            {
                MessageBox.Show("Verbunden mit ConnectionID " + aConnectionID.ToString());
            }
    
        }
    }
    Weiss jemand woran mein Problem liegt, weiss jemand, wie ich vielleicht eleganter TCapiISDN für ein C#-Projekt zur Verfügung stellen kann.

    Grüße
    Peter
Working...
X