Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit COM Event Automation - EventSinkImp (https://www.delphipraxis.net/85194-problem-mit-com-event-automation-eventsinkimp.html)

megaplage 27. Jan 2007 00:34


Problem mit COM Event Automation - EventSinkImp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

habe mich mehrere Tage durchs Netz gekämpft um einer COM-Library die Events zu entlocken - kein Erfolg ...

Es handelt sich um eine API von Cortal Consors um Banking-Aufgaben zu erledigen. Mittels EventSinkImp habe ich einen Event-Wrapper erzeugt aber die Ereignisse werden nicht durchgestellt. Auf herkömmlichem Wege mittels der dispinterfaces oder dualen Schnittstellen komme ich auch nicht weiter.
Mit C# ist es in 5 Zeilen erledigt, aber ich wollte gerne nur eine Anwendung und nicht alles aufteilen.

Vielleicht sieht einer von Euch besser durch und hat einen Tipp ?

Vielen Dank

TKC 27. Jan 2007 00:50

Re: Problem mit COM Event EventSinkImp
 
Liste der Anhänge anzeigen (Anzahl: 1)
hmm ..also ich habe schon öfters festgestellt das D2006 eine TLB besser importiert .. ich habe das mal für dich erledigt.

Teste es mal damit, wenn du etwas code zeigst könnten evtl andere noch helfen. :wink:

megaplage 27. Jan 2007 09:41

Re: Problem mit COM Event EventSinkImp
 
Vielen Dank, aber daran liegt es nicht. Habe D2005 verwendet.

Hier mal ein Beispiel meiner Versuche mit dem Ereignis SessionLogout

aus der TLB:

Delphi-Quellcode:
_CallbackSessionLogout = interface;
_CallbackSessionLogoutDisp = dispinterface;
ISessionLogoutSubscriptionCallbackEvents = dispinterface

  _CallbackSessionLogout = interface(IDispatch)
    ['{C5F3FBC2-5ACE-37C2-A400-B146B40B9656}']
  end;

  _CallbackSessionLogoutDisp = dispinterface
    ['{C5F3FBC2-5ACE-37C2-A400-B146B40B9656}']
  end;

  ISessionLogoutSubscriptionCallbackEvents = dispinterface
    ['{D99CA617-21FD-345D-9936-C23238B7AB4F}']
    procedure OnLogout; dispid 1610743808;       !!! diese Zeile fehlt in der unit vom PASTLWTR : 1.2 ???
  end;

  _SessionLogoutSubscription = interface(IDispatch)
    ['{8B4C37BD-43ED-3215-8259-968FD8102B81}']
    function Get_ToString: WideString; safecall;
    function Equals(obj: OleVariant): WordBool; safecall;
    function GetHashCode: Integer; safecall;
    function GetType: _Type; safecall;
    procedure add_OnLogout(const value: _CallbackSessionLogout); safecall;
    procedure remove_OnLogout(const value: _CallbackSessionLogout); safecall;
    property ToString: WideString read Get_ToString;
  end;

  _SessionLogoutSubscriptionDisp = dispinterface
    ['{8B4C37BD-43ED-3215-8259-968FD8102B81}']
    property ToString: WideString readonly dispid 0;
    function Equals(obj: OleVariant): WordBool; dispid 1610743809;
    function GetHashCode: Integer; dispid 1610743810;
    function GetType: _Type; dispid 1610743811;
    procedure add_OnLogout(const value: _CallbackSessionLogout); dispid 1610743812;
    procedure remove_OnLogout(const value: _CallbackSessionLogout); dispid 1610743813;
  end;

  CoCallbackSessionLogout = class
    class function Create: _CallbackSessionLogout;
    class function CreateRemote(const MachineName: string): _CallbackSessionLogout;
  end;
1. Versuch : Verwendung der von EventSinkImp generierten Event-Wrapper

Er erzeugt eine Klasse TCC_APIISessionLogoutSubscriptionCallbackEvents, die habe ich so bemüht wie es in der Hilfe gesagt wird -> Interface wird connected aber wenn es zum Ereignis kommen soll keine Reaktion.

Delphi-Quellcode:
te:=session.GetSessionLogoutSubscription;
test:=TCC_APIISessionLogoutSubscriptionCallbackEvents.Create(self);
test.OnLogout:=oncclogout;
test.Connect(te);

2. Versuch : direkte Programmierung wie bei http://www.techvanguards.com/ beschrieben

Geht teilweise aber wenn es interessant wird können Klassen nicht gecastet werden oder Objekt nicht registriert und so Sachen

Ich vermute ja dass ich irgendwie die Methode add_OnLogout(const value: _CallbackSessionLogout); verwenden muss aber das endet mit besagten Fehlern

So, wenn jemand durch das Thema ist sollte er mit diesen Informationen zurechtkommen - lt. den Angaben diverser Delphi COM Seiten ?!

TKC 27. Jan 2007 12:08

Re: Problem mit COM Event Automation - EventSinkImp
 
Kannst du mir mal noch die Deklaration von oncclogout zeigen ?

Evtl. liegt der fehler ja beim Callback.

megaplage 27. Jan 2007 12:22

Re: Problem mit COM Event Automation - EventSinkImp
 
Hier ist sie...

Delphi-Quellcode:
procedure TfOTC.OnCCLogout(Sender: TObject);
begin
  windows.beep(100,500);
  application.title:='EXIT';
end;
Nur es kommt nicht mal zum Aufruf der Methoden des Event Wrappers, geschweige denn meines eigentlichen Handlers (Quellcodestück) - d.h. irgendetwas fehlt noch zwischen dem COM-Server und meinen Versuchen.

TKC 28. Jan 2007 10:59

Re: Problem mit COM Event Automation - EventSinkImp
 
Hi,

ich habe mir mal die Trading API geladen und installiert ... teste mal nen bisschen.

Gebe dir bescheid wenn ich weiter komme.

TKC 28. Jan 2007 23:25

Re: Problem mit COM Event Automation - EventSinkImp
 
Hi,

also ich bekomme noch nicht einmal einen Login hin.
Funktioniert das bei dir ?

megaplage 29. Jan 2007 22:23

Re: Problem mit COM Event Automation - EventSinkImp
 
Einfaches Testprogramm

Session erstellen (automatisch in Demo-Konto einloggen) :
Delphi-Quellcode:
  var session :SessionFacade;
    login  :LoginSettings;

  coinitialize(nil);
  session:=CoSessionFacade.Create;
  login:=session.GetLoginSettings(0);
  login.setLoginData('555555555','12345','');
  session.AutoLoginWithAddOnName('Test',false,login);
dann kann man alles was das session-Objekt hergibt machen ... z.B.

Delphi-Quellcode:
if session.isLoggedIn ...
dann z.B. das Event für Logout-Erkennung einrichten

Delphi-Quellcode:
  var ev : SessionLogoutSubscription;

  ev:=session.GetSessionLogoutSubscription;
oder für eine Push-Quote (Wertpapierkurs/Umsatz)

Delphi-Quellcode:
var qk :quoteKey;
    qs :quoteSubscription;

  qk:=session.CreateQuoteKey;
  qk.Set_SecurityCode('710000');
  qk.Set_StockexchangeId('ETR');
  qs:=session.GetQuoteSubscription(qk);
und diese Ereignisse dann zu empfangen ist mein Problem (ev oder qs bieten dann diese Add_OnXXX / Remove_OnXXX Methoden die wohl der Schlüssel dazu sind) ?!

Im Tray ist das API-Symbol da kann man über das Kontextmenü den Status verfolgen und z.B. sehen wie Quotenereignisse ankommen

TKC 30. Jan 2007 00:15

Re: Problem mit COM Event Automation - EventSinkImp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich kann das nicht nachvollziehen ... sobald ich einen Loginversuch mache friert mein Testprogramm ein und das wars.

Habe es auch mit deiner API übersetzung probiert kein Erfolg.

Es könnte jetzt nur noch an der mscorlib_tlb.pas hängen.

Ich hänge dir mal mein Testprojekt an ... evtl kannst dus ja mal bei dir Testen ... bei mir bekomme ich den Login nicht hin.

greez ACE

megaplage 30. Jan 2007 11:09

Re: Problem mit COM Event Automation - EventSinkImp
 
Hm, das erzeugt bei mir Schutzverletzungen und endet mit dem IDE Totalabsturz...

Habe .NET 1.1 und die zugehörige API installiert und auch erfolgreich verwendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz