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