Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi COM-Object mit Events (https://www.delphipraxis.net/97304-com-object-mit-events.html)

markus.waibel 8. Aug 2007 10:24


COM-Object mit Events
 
[delphi]Ich sollte ein COM-Objekt einbinden und auf dessen Events reagieren.
Ich kann zwar auf die Properties und Methoden zugreifen, die Events sind jedoch nicht vorhanden.
In einem VB-Beispiel wird die Klasse mit "Private WithEvents m_objAPI As API" instanziert. Was ich jetzt brauche ist der passende Delphi-Befehl zu der "WithEvents"-Anweisung.

Hat da jemand eine Idee?

Bernhard Geyer 8. Aug 2007 11:05

Re: COM-Object mit Events
 
Importier dir doch die Typlibrary und lass dir von Delphi ein paasendes VCL-Objekt mit passend verknüpfter Eventschnittstelle erstellen.

Falls aufgrund von "komischer" Eventschnittstelle nicht klappt probier mal EventSinkImp aus.

markus.waibel 8. Aug 2007 11:25

Re: COM-Object mit Events
 
Hallo Bernhard,

klappt leider beides nicht. Delphi erstellt die Events in einem dispinterface(was auch immer das bedeutet.

Das Programm sventsinkimp meldet "Unable to import type library file:...."

Was nu?????

Danke für deine Antwort

Markus

Bernhard Geyer 8. Aug 2007 12:24

Re: COM-Object mit Events
 
Zitat:

Zitat von markus.waibel
Das Programm sventsinkimp meldet "Unable to import type library file:...."

Dann beinhaltet die ausgewählte Datei keine TLB bzw. ist für Delphi nicht lesbar.

Um was für ein COM-Objekt geht es denn?

shmia 8. Aug 2007 12:30

Re: COM-Object mit Events
 
@markus.waibel: kannst du deine Delphi Version in deinen persönlichen Einstellungen hinterlegen ?
Von der Version hängt auch ab, wie gut Delphi mit TLBs und COM-Objekten umgehen kann.
Unterhalb von Delphi 5 ist diese Unterstützung noch relativ unzureichend.

markus.waibel 8. Aug 2007 12:34

Re: COM-Object mit Events
 
@SHMIA: Da komm ich jetzt nicht ganz mit. Vermute du sprichst das Tool EventSinkGenerator an. bei Optionen kann ich da jedoch nichts einstellen was die Delphi-Version betrifft. Ich verwende Delphi7.
Gruß Markus

jim_raynor 8. Aug 2007 12:43

Re: COM-Object mit Events
 
Zitat:

Zitat von markus.waibel
@SHMIA: Da komm ich jetzt nicht ganz mit. Vermute du sprichst das Tool EventSinkGenerator an. bei Optionen kann ich da jedoch nichts einstellen was die Delphi-Version betrifft. Ich verwende Delphi7.
Gruß Markus

Er meint dein Delphi-PRAXIS User-Profil ;) Da kann man eintragen, welche Delphi Version man verwendet.

markus.waibel 8. Aug 2007 12:51

Re: COM-Object mit Events
 
OK Jetzt hab ich's.
Mein Profil habe ich eben aktualisiert.

markus.waibel 8. Aug 2007 20:32

Re: COM-Object mit Events
 
Ich hab jetzt mal nachgelesen und begonnen meinen eigenen EventSink zu entwickeln.
Im Moment scheitere ich daran den Events die Parameter zu übergeben. Ich habe mich an ein Beispiel von Codegear gealten. Dabei wird ein kleines Testprogramm (Client und Server) erstellt, welches ein Event vom Server im Client abhandelt. Dieses Event hat jedoch keine Übergabeparameter. Mein Event übergibt zwei Parameter. Wie bekomme ich jetzt die Parameter des Events des Servers in der Invoke-Prozedur als Parameter für meine Client-Prozedur?????

(Ich hoffe das war jetzt nicht zu kompliziert...)

shmia 9. Aug 2007 12:30

Re: COM-Object mit Events
 
Kannst du TLB mal hochladen und dazu angeben, um welches Event-Interface es sich handelt ?
Man kann die TLB wie folgt extrahieren:
Im Delphi Menue: Datei -> Öffnen
Dateityp auf "Typbibliothek" umstellen.
EXE, DLL oder OCX-Datei laden. (kann sehr laaaange dauern)
Datei -> Speichern unter (Dateiendung auf .TLB ändern)

Als Hintergrund:
um ein COM-Event zu empfangen, benötigt man entweder
a.) ein passendes IDispatch-Interface oder
b.) ein Interface, dass von der Server-TLB vorgegeben wird. (frühe Bindung)
Delphi kann nur mit dem Fall a.) umgehen; mit Fall b.) kommt Delphi (aber auch VB-Script, Java-Script) nicht klar.
Beim Fall a.) gibt es noch zwei Varianten:
1.) entweder der Server ruft zuerst die function GetIDsOfNames auf, und danach Invoke
2.) der Server ruft direkt Invoke auf weil ihm die DispIds schon von der TLB bekannst sind.
Wenn der Server nach Fall 1.) agiert (ist aber eher selten), dann hat Delphi ein Problem:
Delphi-Quellcode:
function TEventDispatch.GetIDsOfNames(const IID: TGUID; Names: Pointer;
  NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;
begin
  Result := E_NOTIMPL; // nicht implementiert, blöd
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:20 Uhr.
Seite 1 von 2  1 2      

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