![]() |
Bei OLE Server auf Ereignisse reagieren
Hallo zusammen,
das ist ein Ausschnitt der automatisch generierten Datei beim Typbibliothekenimport:
Delphi-Quellcode:
kann mir eventuell jemand erklären, wie im Client die procedure OnFileDirty deklariert, eingebunden oder sonstwas werden muss, damit der Client das Ereignis mitbekommt.
// *********************************************************************//
// 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; 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.) |
Re: Bei OLE Server auf Ereignisse reagieren
Kann mir bei dem Problem wirklich niemand einen Tip geben??? :cry:
|
Re: Bei OLE Server auf Ereignisse reagieren
Zitat:
![]() |
Re: Bei OLE Server auf Ereignisse reagieren
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? |
Re: Bei OLE Server auf Ereignisse reagieren
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. |
Re: Bei OLE Server auf Ereignisse reagieren
Liste der Anhänge anzeigen (Anzahl: 1)
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. |
Re: Bei OLE Server auf Ereignisse reagieren
Welchem "normalen" Interface sollten denn die Event zugeordnet sein? EventSinkImpl sollte hier helfen können.
|
Re: Bei OLE Server auf Ereignisse reagieren
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
Delphi-Quellcode:
oder
MyFileAccessEvents.Connect(MyInventerIntf.FileAccessEvents)
Delphi-Quellcode:
MyFileAccessEvents.Connect(MyInventerIntf)
wobei MyInventerIntf vom Typ Application ist. Aufgrund des Mangels einer Inventor-Installation kann ich das nicht selbst testen :-( :-) |
Re: Bei OLE Server auf Ereignisse reagieren
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! :bounce2: :dancer2: :dancer: :cheer: Vielen Dank an Bernhard Geyer!!! :cheers: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 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