![]() |
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:
die implementierung der get/set-klassen sind standard.
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; ... im com-objekt:
Delphi-Quellcode:
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?
....
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; ... vielen dank sven |
Re: Ein COM+ Server ist gar nicht so einfach :-(
Wie hast Du Dein Interface deklariert? Hat es eine GUID?
...:cat:... |
Re: Ein COM+ Server ist gar nicht so einfach :-(
ja hat es
|
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:... |
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. |
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:
...:cat:...
type
IMyIntf = interface [GUID...] procedure Yeah; stdcall; end; TMyIntf = class(TTypedCOMObject, IMyIntf) protected procedure Yeah; stdcall; end; |
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:
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?
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; 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 |
Re: Ein COM+ Server ist gar nicht so einfach :-(
Zitat:
...:cat:... |
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?
|
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 22:18 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