AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Bei OLE Server auf Ereignisse reagieren

Bei OLE Server auf Ereignisse reagieren

Ein Thema von Berni68 · begonnen am 6. Jun 2009 · letzter Beitrag vom 12. Jun 2009
Antwort Antwort
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#1

Bei OLE Server auf Ereignisse reagieren

  Alt 6. Jun 2009, 18:36
Hallo zusammen,

das ist ein Ausschnitt der automatisch generierten Datei beim Typbibliothekenimport:

Delphi-Quellcode:
// *********************************************************************//
// DispIntf: FileAccessEventsObject
// Flags: (4096) Dispatchable
// GUID: {3D67DF18-9BC6-4470-A9E3-C820CB4E821C}
// *********************************************************************//
  FileAccessEventsObject = dispinterface
    ['{3D67DF18-9BC6-4470-A9E3-C820CB4E821C}']
    property Type_: ObjectTypeEnum readonly dispid 0;
    property Parent: Application readonly dispid 2130706434;
    property Application: Application readonly dispid 2130706433;
  end;

// *********************************************************************//
// DispIntf: FileAccessEventsSink
// Flags: (4096) Dispatchable
// GUID: {E51041E7-5DB6-4951-9F76-3ACA9B2E2A66}
// *********************************************************************//
  FileAccessEventsSink = dispinterface
    ['{E51041E7-5DB6-4951-9F76-3ACA9B2E2A66}']
    procedure OnFileResolution(const RelativeFileName: WideString; const LibraryName: WideString;
                               var CustomLogicalName: {??PSafeArray} OleVariant;
                               BeforeOrAfter: EventTimingEnum; const Context: NameValueMap;
                               out FullFileName: WideString; out HandlingCode: HandlingCodeEnum); dispid 50335665;
    procedure OnFileDirty(const RelativeFileName: WideString; const LibraryName: WideString;
                          var CustomLogicalName: {??PSafeArray} OleVariant;
                          const FullFileName: WideString; const DocumentObject: Document;
                          BeforeOrAfter: EventTimingEnum; const Context: NameValueMap;
                          out HandlingCode: HandlingCodeEnum); dispid 50335666;
  end;

// *********************************************************************//
// Schnittstelle: _IRxFileAccessEvents
// Flags: (272) Hidden OleAutomation
// GUID: {A612930B-F89B-41DB-82B1-3E1B0ED4C095}
// *********************************************************************//
  _IRxFileAccessEvents = interface(IUnknown)
    ['{A612930B-F89B-41DB-82B1-3E1B0ED4C095}']
    function Get_Type_(out Result: ObjectTypeEnum): HResult; stdcall;
    function Get_Parent(out Result: Application): HResult; stdcall;
    function Get_Application(out Result: Application): HResult; stdcall;
  end;

// *********************************************************************//
// Schnittstelle: IRxFileAccessEvents
// Flags: (384) NonExtensible OleAutomation
// GUID: {32E4A318-C5E8-11D2-B77F-0060B0F159EF}
// *********************************************************************//
  IRxFileAccessEvents = interface(IUnknown)
    ['{32E4A318-C5E8-11D2-B77F-0060B0F159EF}']
    function OnFileResolution(const RelativeFileName: WideString; const LibraryName: WideString;
                               var CustomLogicalName: PSafeArray; out FullFileName: WideString;
                               out HandlingCode: HandlingCodeEnum): HResult; stdcall;
    function OnFileDirty(const RelativeFileName: WideString; const LibraryName: WideString;
                          var CustomLogicalName: PSafeArray; const FullFileName: WideString;
                          const DocumentObject: Document; out HandlingCode: HandlingCodeEnum): HResult; stdcall;
  end;
kann mir eventuell jemand erklären, wie im Client die procedure OnFileDirty deklariert, eingebunden oder sonstwas werden muss, damit der Client das Ereignis mitbekommt.

Ein Beispiel wäre nett und wohl sehr hilfreich.

Warum findet man hierzu eigentlich keinerlei QuellcodeBeispiele?
Kurioserweise findet man ettliche Beispiele wie man solche OLE-Server bastelt, aber nicht wie man sie verwendet (allenfalls total abstrakte Ausführungen (incl. Delphihandbuch) ohne praktischen nutzen.)
Bernhard
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 7. Jun 2009, 12:48
Kann mir bei dem Problem wirklich niemand einen Tip geben???
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.177 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 7. Jun 2009, 16:27
Zitat von Berni68:
..., aber nicht wie man sie verwendet (allenfalls total abstrakte Ausführungen (incl. Delphihandbuch) ohne praktischen nutzen.)
Beispiel gibts doch wenn man die richtigen Suchebegriffe hat: EventSinkImp
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 12. Jun 2009, 09:12
Danke für den Hinweis auf die Beispiele!

Die Beispiele haben mich allerdings nicht wirklich weitergebracht.
Deshalb versuche ich es jetzt auf diese Weise:

Findet sich jemand, der mir gegen Entgelt bei der Lösung des Problems behilflich ist?
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 12. Jun 2009, 10:23
Delphi kann doch einen Komponentenwrapper erzeugen und darüber die Events empfangen.
Dazu muss man beim Import der TLB eine Option setzen (die ich gerade bei D5 nicht auswendig weiss, aber das Wort "Komponente" oder "Wrapper" enthält).
Du kannst ja mal die komplette importierte Datei ???_TLB.pas hier als Anhang posten.

Die Komponente sollte auf der Palettenseite "ActiveX" erscheinen und kann dann wie gewohnt auf dein Formular gezogen werden.
Diese Komponente hat dann in deinem Fall die Events OnFileResolution und OnFileDirty.
Ein Doppelklick auf ein Event im Objektinspector erzeugt dann den Methodenrumpf im Formular.

Allerdings sind diese Komponentenwrapper nicht perfekt und man kann damit nur Events basierend auf dem Interface IDispatch empfangen.
Was bei deiner TLB ja der Fall ist.
fork me on Github
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 12. Jun 2009, 11:07
Beim Import habe ich das Häkchen beim Komponentenwrapper gesetzt.

Die Komponente erscheint auch in der Palette, besitzt aber KEINE Ereignisse.
Insgesamt habe ich drei Bibliothenken importiert. Daraus entstanden sind:

Inventor_TLB.pas (ist in jedem Fall nötig)
EventHandlerLib_TLB.pas und AFGLib_TLB.pas bringen die Komponenten die in der Palette erscheinen.
Beim Importieren kam allerdings der Hinweis, daß (manche Komponente) schon installiert sein. Diese habe ich dann umbenannt.

Wenn in die .tlb 's mal jemand einen Blick reinwerfen könnte wäre prima. Eventuell mache ich ja was grundsätzlich falsch. Wenn die Ereignisse in der Palettenkomponente auftauchen würden wär's einfach.
Allerdings hat nicht eine Komponente auch nur ein Ereignis.
Aber grundsätzlich funktioniert der Zugriff auf den Server sehr gut.
Angehängte Dateien
Dateityp: zip tlb_137.zip (379,4 KB, 10x aufgerufen)
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.177 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 12. Jun 2009, 11:21
Welchem "normalen" Interface sollten denn die Event zugeordnet sein? EventSinkImpl sollte hier helfen können.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.177 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 12. Jun 2009, 11:27
Hab mal nachgeschaut:


1, Erstelle mit EventSinImpl (Link oben) eine Event-Wrapper-Komponente:

2, Über dein Appliaction-Interface bekommst du über das Property FileAccessEvents einen Event-Zeiger.
Diesen solltest du über den in Punkt 1 erzeugten Wrappercomponente mittels

  MyFileAccessEvents.Connect(MyInventerIntf.FileAccessEvents) oder

  MyFileAccessEvents.Connect(MyInventerIntf)
wobei MyInventerIntf vom Typ Application ist.

Aufgrund des Mangels einer Inventor-Installation kann ich das nicht selbst testen
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Bei OLE Server auf Ereignisse reagieren

  Alt 12. Jun 2009, 20:19
Der Hinweis mit EventSinImpl die Komponenten zu erzeugen war es.
Die Komponenten haben jetzt in Delphi die Ereignisse sichtbar.

Der Rest ist dann ja machbar.
Das für mich fast unfassbare tritt ein: Der Server antwortet!

Vielen Dank an Bernhard Geyer!!!
Bernhard
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
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