Einzelnen Beitrag anzeigen

DelphiApostel

Registriert seit: 12. Apr 2005
10 Beiträge
 
Delphi 2010 Enterprise
 
#1

Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 15. Dez 2006, 12:19
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):

Delphi-Quellcode:
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:
Delphi-Quellcode:
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.: damit es kein Ärger gibt: die gleiche Frage habe ich auch in diesem Forum gestellt:
http://www.delphi-forum.de/topic_Zug...nst_67670.html

Vielen Dank schon mal für Eure Hilfe
MfG
Delphi-Apostel
  Mit Zitat antworten Zitat