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-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; hr: HRESULT; begin CoInitialize(nil); OleInitialize(nil); hr := CoCreateInstance(Class_TDA_Listener, nil, CLSCTX_LOCAL_SERVER, IID_ITDA_Listener, MyListener); MyListener.SendMsg('HALLO'); 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:
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; 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
MfG
Delphi-Apostel
Moderiert von raziel: Code- durch Delphi-Tags ersetzt