![]() |
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:... |
Re: Ein COM+ Server ist gar nicht so einfach :-(
ok, danke fuer deine zeit. dann werd ich das mal so umbauen.
viele gruesse sven |
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 02:03 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