Autor Beitrag
Delphi_Apostel
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 15.12.06 13:32 
Hallo ihr Lieben,

ich habe ein Problem beim Zugriff auf einen selbstgeschriebenen COM-Server aus einem Delphi-Dienst heraus:

1) ich habe einen "out-of-process" COM-Server (EXE-Datei) erstellt mit einer kleinen Funktion, die einfach nur eine Meldung in einer Memo-Box ausgibt.

2) danach erstellte ich einen Windows-Dienst (COM-Client) und hab dann die Typbibliothek importiert (Unit erstellt)

3) bei Bedarf wird dann im Dienst das entsprechende Interface (Objekt) erzeugt und die Funktion des COM-Servers (der Schnittstelle) aufgerufen.
Quellcode des COM-Clients (wie ihr sehen könnt, habe ich unterschiedliche Varianten ausprobiert):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure SendMsg(Nachricht:PChar);
var
 MyListener:ITDA_Listener;
 //MyListener:TTDA_Listener;
 hr: HRESULT;
begin
  CoInitialize(nil);
  OleInitialize(nil);
  //MyListener:=CreateCOMObject(Class_TDA_Listener) as ITDA_Listener;
  //MyListener:=CoTDA_Listener.Create;
  //MyListener:=TTDA_Listener.Create(nil);
  hr := CoCreateInstance(Class_TDA_Listener, nil, CLSCTX_LOCAL_SERVER, IID_ITDA_Listener, MyListener);
  MyListener.SendMsg('HALLO');
  //FreeAndNil(MyListener);
  CoUnInitialize;
  OleUnInitialize;
end;


Dabei wird keine Fehlermeldung angezeigt. Das Objekt (Interface) wird auch richtig erzeugt. Nur wird auf dem COM-Server keine Meldung in der Memo-Box angezeigt.

Wenn ich jetzt die gleichen Anweisungen in einer normalen EXE-Datei (Anwendung) ausführe, dann klappt das auch. Ich bekomme dann einen neuen Eintrag in der Memo-Box.
Woran liegt das? Gibt es irgendwelche Einschränkungen, die ich nicht beachtet habe? Der Dienst läuft unter dem gleichen Admin-Konto, wie die COM-Server Applikation auch.

Der COM-Server ist ein Programm (in meinem Fall Listener.exe), welches alle Events/Ereignisse des Windows-Dienstes (COM-Client) in der Memo-Box anzeigt. Damit ich keine Textdateien (Log-Dateien) oder überflüssige Event-Log Einträge erstellen muss...

Weitere Informationen zu meinem COM-Server:
- Instantiierung: mehrere Instanzen
- Threading-Modell: Apartment
- Schnittstelle ist als "Ole-Automatisierung" deklariert


Quellcode des COM-Servers:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
unit InterfaceListener;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, ActiveX, Classes, ComObj, Listener_TLB, StdVcl;

type
  TTDA_Listener = class(TTypedComObject, ITDA_Listener)
  protected
    function SendMsg(const WMsgText: WideString): HResult; stdcall;
    {ITDA_Listener-Methoden hier deklarieren}
  end;

implementation

uses ComServ,Hauptunit;


function TTDA_Listener.SendMsg(const WMsgText: WideString): HResult;
begin
   Form1.Nachrichten.Lines.Add(WMsgText);
end;


initialization
  TTypedComObjectFactory.Create(ComServer, TTDA_Listener, Class_TDA_Listener,
    ciMultiInstance, tmApartment);
end.



PS.: die gleiche Frage habe ich auch bei Delphi-Praxis gestellt:
www.delphipraxis.net...134e83166e726fbed1b3

Vielen Dank schon mal für Eure Hilfe :wink:
MfG
Delphi-Apostel

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt