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 Ein COM+ Server ist gar nicht so einfach :-( (https://www.delphipraxis.net/7177-ein-com-server-ist-gar-nicht-so-einfach.html)

svehei 4. Aug 2003 16:56


Ein COM+ Server ist gar nicht so einfach :-(
 
hallo zusammen,

ich haenge immer noch an meinem COM-Server und bin wiedermal auf ein Problem gestossen, das mir schon wieder heftiges kopfzerbrechen mitbringt :-(

hier nun mein problemchen:

wie erwaehnt baue ich gerade an einem COM+ (InProc) Server. Nun habe ich eine methode mit der ich eine xml-datei parse. da ich die gewonnenen informationen aus der xml-datei aber in mehreren methoden, also oefters, benoetige moechte ich eine art data-storage-klasse implementieren, die durch ihre methoden und properties meine gewonnen informationen beschreibt. zusaetzlich hat meine klasse dann eine import-funktion, die anhand des filenames (der xml-datei) diese dann parst und sich "selber fuellt".
mein problem ist nun, dass ich die klasse zwar wunderbar gefuellt und kompiliert bekomme, wenn ich aber von einer interface-methode auf properties der klasse zugreife ich den wert nicht zurueckbekomme (nicht an meine anwendung weitergeben kann) - warum auch immer.

hier nun die codebeispiele:

die "data-storage-klasse":
Delphi-Quellcode:
  TDataStorage = class(TObject)
  private
    FValue: OleVariant;
  protected
  public
    constructor create;
    procedure Import(XMLFile : String);
    procedure setValue(value: OleVariant);
    function getValue: OleVariant;
    property defaultValue: OleVariant read getValue write setValue;
  end;
...
die implementierung der get/set-klassen sind standard.

im com-objekt:
Delphi-Quellcode:
    ....
    private //property fuer com
      FDataStorage: TDataTorage;
    protected
      function Get_DataStorage(out Value: OleVariant): HResult; stdcall;
      function Set_DataStorage(var Value: OleVariant): HResult; stdcall;
    ...
    //in einer Interface-Methode rufe starte ich den import
    FDataStorage := TDataStorage.create;
    FDataStorage.Import(fileName);
    Set_DataStorage(FDataStorage);
    ...
    //in einer anderen InterfaceMethode auf das schon moechte ich auf das schon "importiert/gefuellte" Objekt zugreifen
    if assigned(FDataStorage) then
    begin
      retVal := FDataStorage.defaultValue; //retVal ist der OUT-Parameter
    end;
    ...
im prinzip wie bei ganz normalen klassenobjekten und deren properties. nur bei meinem inproc-server klappts nicht. an was koennte das liegen? hat da bitte jemand ne idee dazu?

vielen dank

sven

sakura 4. Aug 2003 17:03

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
Wie hast Du Dein Interface deklariert? Hat es eine GUID?

...:cat:...

svehei 4. Aug 2003 17:10

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
ja hat es

sakura 4. Aug 2003 17:12

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
Zeig mal trotzdem die Deklaration und die Anbindung an die Klasse. Diese wichtigen Teile hast Du nicht gepostet...

...:cat:...

svehei 4. Aug 2003 17:19

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
du meinst die deklaration von meiner dll? die data-storage klasse ist da nicht mit drin

Delphi-Quellcode:
type
  TLMSServer = class(SAApplicationService, ILMSServer)
  private
  ...
    FDataStorage: TDataTorage;
  ...
  protected
  ...
  function Get_DataStorage(out Value: OleVariant): HResult; stdcall;
  function Set_DataStorage(var Value: OleVariant): HResult; stdcall;
    ...

  ...
  end;

wobei SAApplicationService von meinem AppServer vorgegeben wird, den ich benutzen muss.

sakura 4. Aug 2003 17:24

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
Mich interessiert eigentlich die Deklaration der Klasse, welche Du über das Interface nutzen möchtest. Einfaches Beispiel.
Delphi-Quellcode:
type
  IMyIntf = interface
    [GUID...]
    procedure Yeah; stdcall;
  end;

  TMyIntf = class(TTypedCOMObject, IMyIntf)
  protected
    procedure Yeah; stdcall;
  end;
...:cat:...

svehei 5. Aug 2003 08:42

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
ah, vielleicht ist das mein fehler gewesen. die zusaetzliche data-storage klasse habe ich wie eine ganz normale klasse deklariert:

Delphi-Quellcode:
TDataStorage = class(TObject)
  private
    FValue: OleVariant;
  protected
  public
    constructor create;
    procedure Import(XMLFile : String);
    procedure setValue(value: OleVariant);
    function getValue: OleVariant;
    property defaultValue: OleVariant read getValue write setValue;
  end;
diesse klasse habe ich nicht in der tlb deklariert. ich dachte ich kann auf die klasse einfach wie bei standard-applicationen zugreifen ?!?! liege ich da falsch?

meine prinzipielle vorgehensweise:

1)neue ActiveX-Library
2)dieser Library ein neues com-objekt hinzugefuegt
3)benoetigte methoden dem com-objekt/Interface hinzugefuegt
4)eine neue unit mit meiner DataStorage-Klasse (von TObject) abgeleitet
5)von meinem interface wie beschrieben versucht auf die DataStorage-Klasse zuzugreifen

sakura 5. Aug 2003 08:50

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
Zitat:

Zitat von svehei
ich dachte ich kann auf die klasse einfach wie bei standard-applicationen zugreifen ?!?! liege ich da falsch?

Yep, da liegst Du falsch ;-) Delphi-Objekte können nicht einfach durch COM-Interfaces gestreamt werden. Theoretisch ist es wohl möglich, nur das Wie? Dann bleibt aber das Problem, daß man nur mit einem Client darauf zugreifen könnte der in genau derselben Delphi-Version (inkl. Update-Version) geschrieben ist, da sonst der identische Aufbau der Klassen-Verwaltung nicht garantiert ist.

...:cat:...

svehei 5. Aug 2003 08:57

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
was soviel bedeutet wie dass ich fuer meine data-storage-klasse auch ein interface definieren muss?

sakura 5. Aug 2003 09:36

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
Ja, und die Klasse solltest Du dann von TCOMObject anstatt von TObject ableiten.

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 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