Delphi-PRAXiS

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:...

svehei 5. Aug 2003 09:47

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
ok, danke fuer deine zeit. dann werd ich das mal so umbauen.

viele gruesse

sven

svehei 5. Aug 2003 12:30

Re: Ein COM+ Server ist gar nicht so einfach :-(
 
jetzt kommt nur noch die meisterpreisfrage:

ich habe nun aus meiner TObject-Daten-Storage-Klasse ein neues Interface fuer meinen InPorc-Server gebastelt. aber wie kann ich jetzt das neue Interface in meinem "alten" instanuieren um es mit daten zu fuellen?

FDataStorage.create is ja jetzt nicht mehr, muss ich die jetzt auch mit CreateCOMObject instanzieren?


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