AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi COM: Wie bekomme ich das Objekt hinter einem Interface

COM: Wie bekomme ich das Objekt hinter einem Interface

Ein Thema von ulrich.b · begonnen am 21. Feb 2008 · letzter Beitrag vom 22. Feb 2008
Antwort Antwort
ulrich.b

Registriert seit: 21. Sep 2005
Ort: Kattau (AT)
79 Beiträge
 
Delphi 2009 Professional
 
#1

COM: Wie bekomme ich das Objekt hinter einem Interface

  Alt 21. Feb 2008, 00:18
COM Server

Zum einen habe ich eine Daten Klasse

Delphi-Quellcode:
  TDaten = class(TAutoObject, IDaten)
  private
    FGekapselt: TGekapselt;

  protected
    function Get_A: Integer; safecall;
    procedure Set_A(Value: Integer); safecall;

    function Get_obj_ptr: Pointer; safecall;

  public
    property Gekapselt: TGekapselt read FGekapselt;

  end;
Und zum anderen eine Klasse mit einer Methode, die einen Pointer auf dieses Interface als Parameter hat

Delphi-Quellcode:
  TAndereKlasse = class(TAutoObject, IAndereKlasse)
  protected
    function DoSomething(const Daten: IDaten): Integer; safecall;
  end;

Nun möchte ich innerhalb von DoSomething nicht nur auf die Interface Member, sondern auf das Objekt dahinter (die TDaten Instanz) zugreifen (Bevor ihr wieder alle fragt warum: Um an gekapselte Daten ranzukommen, wie ichs mit dem public Property angedeutet hab).

Gibts da igendeine schöne möglichkeit, um an den Pointer ranzukommen??

Ich hab es nämlich so gelöst:

Delphi-Quellcode:
function TDaten.Get_obj_ptr: Pointer;
begin
  Result := Self;
end;
Zugriff auf die Instanz:

Delphi-Quellcode:
function TAndereKlasse.DoSomething(const Daten: IDaten): Integer;
var
  DatenInstanz: TDaten;
begin
  DatenInstanz := TDaten(Daten.obj_ptr);
end;
Ich exportiere über das Interface einfach eine Methode, die den Objektpointer nach außen liefert. Gibt es hierfür schönere Lösungen? Können durch meine Implementierungen Probleme entstehen?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

Re: COM: Wie bekomme ich das Objekt hinter einem Interface

  Alt 21. Feb 2008, 16:13
Das hab ich mich auch schon gefragt. Normal baut man ja Methoden, die alle anderen Methoden der inneren Klasse nach aussen geben.

Man kann natürlich so, wie du auch den Pointer zur Klasse verwenden. Dann funktioniert das meiner Meinung aber nicht mehr bei out-of-process Situationen. Ich habs noch nicht ausprobiert, kann es daher nicht 100% wissen.

Sonst ausprobieren und mir mitteilen
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: COM: Wie bekomme ich das Objekt hinter einem Interface

  Alt 21. Feb 2008, 16:16
Vielleicht solltest du mal hier schauen, was Bernhard Geyer unten geschrieben hat.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
ulrich.b

Registriert seit: 21. Sep 2005
Ort: Kattau (AT)
79 Beiträge
 
Delphi 2009 Professional
 
#4

Re: COM: Wie bekomme ich das Objekt hinter einem Interface

  Alt 22. Feb 2008, 11:13
Zitat von Dezipaitor:
Dann funktioniert das meiner Meinung aber nicht mehr bei out-of-process Situationen. Ich habs noch nicht ausprobiert, kann es daher nicht 100% wissen.
Was meinst du mit out-of-process Situationen?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

Re: COM: Wie bekomme ich das Objekt hinter einem Interface

  Alt 22. Feb 2008, 11:26
Zitat von ulrich.b:
Zitat von Dezipaitor:
Dann funktioniert das meiner Meinung aber nicht mehr bei out-of-process Situationen. Ich habs noch nicht ausprobiert, kann es daher nicht 100% wissen.
Was meinst du mit out-of-process Situationen?
D.h. das Interfaces kommt aus einem anderen Prozess (oder auch von anderem Rechner) und COM sorgdafür das du einen Proxy in deinem Adressraum vorgesetzt bekommst den COM für die umsetzung auf anderen Prozess/Rechner zu hilfe nimmt. Ein "normales" Delphi-Objekt wird diese Umsetzung nicht überleben.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#6

Re: COM: Wie bekomme ich das Objekt hinter einem Interface

  Alt 22. Feb 2008, 11:28
Du kannst COM Objekte in einem eigenen Prozess (exe-Datei) bereitstellen. Das kann z.B. für Automation (Steuererung dieser Applikation) verwendet werden. D.h. alle COM Aufrufe müssen über Prozessgrenzen hinweg geführt werden. Dazu werden Methodenaufrufe in einem Stream gespeichert (d.h. der Stack) und dann über Netzwerk gesendet (auch lokal).
Dieses Kapseln wird Marshalling genannt. Das Problem dabei ist, dass alle Typen, die der Standardmarshaller nicht kennt, nicht übertragen werden können. Darunter sind dynamische Strukturen (=Zeiger + Datenlänge). Nur bei Out-Of-Process Situationen ist ein Marshaller erforderlich, da Zeiger über Prozessgrenzen nicht gültig sind. Bei In-Process ist das garkein Problem. Man kann auch Zeiger im COM Verpacken. Die Ziele der Zeiger sind ja innerhalb desselben Prozesses.
Leider geht diese Situation vermutlich auch schon nicht mehr, wenn COM Objekte in verschiedenen Apartments sich befinden.

Ich habe so ein Problem, wie oben beschrieben in dem anderen Thread geschildert.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  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 16:20 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