Delphi-PRAXiS

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.

TKC 30. Jan 2007 18:42

Re: Problem mit COM Event Automation - EventSinkImp
 
hmmm ... kannst du mir mal deine mscorlib.pas zukommen lassen .. evtl. liegt es ja daran.

megaplage 30. Jan 2007 19:22

Re: Problem mit COM Event Automation - EventSinkImp
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier nochmal alle units für API 1.1.1 .NET 1.1

(Hatte die mscorlib.pas im 1. Post vergessen)

TKC 30. Jan 2007 19:38

Re: Problem mit COM Event Automation - EventSinkImp
 
Also das ist ja komisch ... ich habe jetzt deine Units und es geht immer noch nicht !

Was ist denn an meinem Project anders ... das Excel Beispiel geht 1a bei mir.

Kannst du mal ein bei dir funktionierendes Beispielproject posten ?

megaplage 30. Jan 2007 21:10

Re: Problem mit COM Event Automation - EventSinkImp
 
genau so war es ja bei mir mit Deinen Daten ... daher mein Tipp mit den Framework/API Versionen

... so Stunden später !!

füge mal vor dem login ein :

Delphi-Quellcode:
if session.isloggedin then exit;
danach ging es bei mir.
So ein Problem hatte ich früher schon mal, allerdings stürzte da nicht einfach alles ab sonder es kam eine Fehlermeldung des .NET Systems ... einfach bevor es 'richtig' losgeht das session-Objekt abfragen.

TKC 30. Jan 2007 21:36

Re: Problem mit COM Event Automation - EventSinkImp
 
Delphi-Quellcode:
if session.isloggedin then exit;
Genau das wars .... jetzt geht es bei mir !! Danke.

Werde mich jetzt mal um die Events kümmern....

TKC 2. Feb 2007 00:00

Re: Problem mit COM Event Automation - EventSinkImp
 
hi,

ist wirklich ein mist ...

Zitat:

(ev oder qs bieten dann diese Add_OnXXX / Remove_OnXXX Methoden die wohl der Schlüssel dazu sind) ?!
genau da ist das Problem !

TKC 3. Feb 2007 14:03

Re: Problem mit COM Event Automation - EventSinkImp
 
hmmm ... also wenn ich die Typelib im oleViewer ansehe dann sehe ich folgendes:

Code:
 [
  uuid(8CA06B18-EE87-44FC-9708-2BEBA2249738),
  version(1.0),
  noncreatable,
  custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, CortalConsors.TradingAPI.SessionLogoutSubscription)
]
coclass SessionLogoutSubscription {
    [default] interface _SessionLogoutSubscription;
    interface _Object;
    [default, source] dispinterface ISessionLogoutSubscriptionCallbackEvents;
};
Demnach müsste OnLogout ja ein Event der "SessionLogoutSubscription" sein oder ?

megaplage 7. Feb 2007 19:54

Re: Problem mit COM Event Automation - EventSinkImp
 
Bin auch nicht weiter gekommen...
Danke dass Du Dich gekümmert hast, sonst scheint ja keiner einen Tipp zu haben

OSchmarren 14. Mai 2007 10:07

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

Habe mich auch mit den Callbacks geärgert. Hab es dann aber doch geschafft.
Anbei der Quellcode eines kleines Beispieles für den "OnQuote"-Callback. Die anderen Callbacks sind gleich zu behandeln, es sollte kein Problem sein den Code entsprechend zu erweitern...
Achtung: Funktioniert nicht mit dem Demo-Account (dort gibt es keine Pushkurse)! Bitte auch unbedingt die API 1.1.1 verwenden, da bei der 2er .NET API keine COM-Ereignisse implementiert sind!

Viel Spass


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr.

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