Autor Beitrag
syox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

WinXP, Debian GNU/Linux mit 2.6.13er Kernel
Visual Studio 6 (C/C++), , Borland Delphi 2005 Prof. (Delphi), Quanta+ (Perl, HTML, CSS)
BeitragVerfasst: Do 17.11.05 10:59 
Hi, habe hier eine RemotingKlasse die nich will...
Nach der Erstellung eines Interface (gepackt in ein Assembly) hat soweit alles funktioniert.
Die Programme lassen sich kompilieren und laufen, bis eine Funktion der RemotingKlasse aufgerufen wird...
Eine Exception sagt mir: "Attempted to create well-known object of type TESRemoting.ITESRemoting. Well known objects must derive from the MarshalByRefObject class."

Das Interface der RemotingKlasse:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
unit TESRemoting;

interface
uses System.Data, System.Data.OleDb;

type
  ITESRemoting = Interface
  function RecieveMessageFromServer() : System.String;
  procedure SendMessageToServer(theMessage : System.String);
  end;

implementation

(* empty, this is just an interface *)

end.


Hier die RemotingKlasse des Servers
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
...
uses //TESRemoting ist im Projekt mittels des Assembly TES_Remoting.dll eingebunden
... TESRemoting ...
...
    TES_Interface = class(MarshalByRefObject, ITESRemoting)
    strict protected
      procedure Finalize; override;
    private
    public
      constructor Create;
      destructor Destroy; override;
      procedure SendMessageToServer(theMessage : System.String);
      function RecieveMessageFromServer() : System.String;
    end;


die Registrierung des Remoting sieht so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
rocedure TWinForm.bStartServer_Click(sender: System.Object; e: System.EventArgs);
begin
  Self.Protocol('Server started.');
  Channel := HTTPChannel.Create(8888);
  ChannelServices.RegisterChannel(Channel);
  RemotingConfiguration.ApplicationName := 'test';
  RemotingConfiguration.RegisterWellKnownServiceType(typeof(ITESRemoting),
        'testme.soap',WellKnownObjectMode.Singleton);
  // Lebenszeit der Objekte bestimmen ...
  LifetimeServices.LeaseTime := TimeSpan.FromSeconds(5);
  LifetimeServices.RenewOnCallTime := TimeSpan.FromSeconds(5);
end;


Die Exception verstehe ich nich so ganz, da die RemotingKlasse doch von MarshalByRefObject abgeleitet wird....
:(

hier nochmal die Exception:
"Attempted to create well-known object of type TESRemoting.ITESRemoting. Well known objects must derive from the MarshalByRefObject class."
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Fr 18.11.05 09:39 
Hallo,

für ein Interface gilt folgendes:

a) die GUID (kann man mit Alt + Shift + G) erstellen
b) Interfaces werden von IUnknown bzw. Plattformunabhängig (bitte wenn falsch korrigieren)
von IInterface abgeleitet.
c) Interfaces werden nicht mit dem Bezeichner
ITest = class(TTest)
sondern mit
ITest = interface(IInterface) abgeleitet.
d) Interface delegieren
ausblenden Delphi-Quelltext
1:
2:
property MyInterface: IMyInterface read FMyInterface   
   implements IMyInterface;


Soviel zu meinem bescheidenen Wissen.

Lies dir doch dazu mal in der Hilfe den entsprechenden Abschnitt durch, das dürfte dir weiterhelfen.
Da steht das auch wesentlich detailierter.

MfG und grüner Schnee. ;)

_________________
Stellen Sie sich bitte Zirkusmusik vor.
syox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

WinXP, Debian GNU/Linux mit 2.6.13er Kernel
Visual Studio 6 (C/C++), , Borland Delphi 2005 Prof. (Delphi), Quanta+ (Perl, HTML, CSS)
BeitragVerfasst: Fr 18.11.05 12:06 
user profile iconopfer.der.genauigkeit hat folgendes geschrieben:
Hallo,

für ein Interface gilt folgendes:

a) die GUID (kann man mit Alt + Shift + G) erstellen

Leider kann ich nicht nachvollziehen was du da meinst.

user profile iconopfer.der.genauigkeit hat folgendes geschrieben:

b) Interfaces werden von IUnknown bzw. Plattformunabhängig (bitte wenn falsch korrigieren)
von IInterface abgeleitet.

Das Interface sollte nicht abgeleitet werden,
die Klasse TES_Interface soll von MarshalbyRefObject abgeleitet werden und dabei das Interface ITESRemoting implementieren:
TES_Interface = class(MarshalByRefObject, ITESRemoting);

user profile iconopfer.der.genauigkeit hat folgendes geschrieben:

c) Interfaces werden nicht mit dem Bezeichner
ITest = class(TTest)
sondern mit
ITest = interface(IInterface) abgeleitet.

Gibt es in Delphi eigentlich Mehrfachvererbung oder nur eine Elternklasse und Interfaces:
class(Vaterklasse, Interface1, Interface2,...);

user profile iconopfer.der.genauigkeit hat folgendes geschrieben:

d) Interface delegieren
ausblenden Delphi-Quelltext
1:
2:
property MyInterface: IMyInterface read FMyInterface   
   implements IMyInterface;


Hier weiß ich auchnicht was delegieren eines Interfaces heißt, wird wahrscheinlich auch recht wenig mit dem Problem des Threads zusammen hängen.

user profile iconopfer.der.genauigkeit hat folgendes geschrieben:

Soviel zu meinem bescheidenen Wissen.

Lies dir doch dazu mal in der Hilfe den entsprechenden Abschnitt durch, das dürfte dir weiterhelfen.
Da steht das auch wesentlich detailierter.

MfG und grüner Schnee. ;)

Danke für die Gedankenanstöße!! Dein "bescheidenes" Wissen hat wenigstens etwas Licht ins Dunkel gebracht.

Die Hilfe im Delphi 2005 Professional hat mich bisher nur Text lesen lassen, leider ohne heiße Spur zur Lösung meines Problems :(
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Fr 18.11.05 12:19 
Hallo,

in der Hilfe gibt es eine Doku, die genau das beschreibt und besser was ich dir als Kurzfassung geschrieben habe.

In der Delphi 2005 Hilfe diesen Link angeben:
[url]ms-help://borland.bds3/bds3guide/html/ObjectInterfacesOV.htm[/url]

_________________
Stellen Sie sich bitte Zirkusmusik vor.
syox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

WinXP, Debian GNU/Linux mit 2.6.13er Kernel
Visual Studio 6 (C/C++), , Borland Delphi 2005 Prof. (Delphi), Quanta+ (Perl, HTML, CSS)
BeitragVerfasst: Mo 21.11.05 11:16 
Danke für die Hilfe,

hab ein wenig gelesen und meine Fehler gefunden:

ausblenden Delphi-Quelltext
1:
2:
// Serverseite (falsch)
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ITESRemoting), 'testme.soap',WellKnownObjectMode.Singleton);


muss heißen:

ausblenden Delphi-Quelltext
1:
2:
// Serverseite
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteMessages), sAppname + '.soap', WellKnownObjectMode.Singleton);



Problem war: Ich hatte beim Server das _Interface_ als WellKnownService eintragen lassen und nicht die implementierte Klasse.
Also Serverseitig die Klasse als WellKnownService eintragen und Clientseitig das Interface (Proxyklasse) verwenden.

ausblenden Delphi-Quelltext
1:
2:
// Clientseite
RemoteMessage := Activator.GetObject(typeof(IMessages), 'http://localhost:8888/testme.soap'as IMessages;