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
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:
TLB:
und hier der C#-Code
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
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");
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.
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.
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()); } } }
Grüße
Peter