AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Zugriff auf einen COM-Server aus einem Delphi-Dienst
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf einen COM-Server aus einem Delphi-Dienst

Offene Frage von "Bernhard Geyer"
Ein Thema von DelphiApostel · begonnen am 15. Dez 2006 · letzter Beitrag vom 2. Mär 2011
Antwort Antwort
Bernhard68

Registriert seit: 2. Mär 2011
4 Beiträge
 
#1

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 12:30
Es ist zwar nun ein paar Jahre her, aber ich bin auch auf der Suche nach der Lösung dieses Problems.

Architektur:
1. Anwendung A (exe) als COM-Server
2. DLL als COM-Client
3a. Anwendnung B verwendet DLL um mit Anwendung A zu kommunizieren.
3b. Dienst (TService) verwendet DLL um mit Anwendung A zu kommunizieren.

Während die ganze Geschichte unter XP mit BCB5 problemlos lief,
bringe ich es unter Win7 mit ECB2010 nicht mehr ans Laufen.
3.a funktioniert auch unter Win7 tadellos, 3b nicht.

Wenn ich über den Dienst, auch wenn er im Administrator-Benutzerkonto läuft,
in der DLL "CoCreateInstance" aufrufe, bekomme ich den Fehlerwert "-2147221008" zurück.

Hat jemand diese Problem lösen können?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.235 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 12:45
Während die ganze Geschichte unter XP mit BCB5 problemlos lief,
bringe ich es unter Win7 mit ECB2010 nicht mehr ans Laufen.
Was passsiert bei BCB5 unter Win7 bzw. bei ECB2010 unter XP?
Sinnvoll ist es erstmal raus zu bekommen ob die IDE oder das OS das Problem verursacht.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Bernhard68

Registriert seit: 2. Mär 2011
4 Beiträge
 
#3

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 13:08
Unter Win7 (wohl ab Vista) sind keine interaktiven Dienste mehr erlaubt.
Interaktive Dienste lassen sich zwar noch im Objektinspektor zur Klasse TService und in der Service Management Console (Dienste) noch konfigurieren, sind aber wohl nicht mehr erlaubt.
Möglicherweise ist das, das Problem?!

Im Thread Programm von Dienst starten lassen (Jetzt aber wirklich mal) wird das Thema auch diskutiert, hat mir aber noch nicht weitergeholfen.

Ich will ja, das der Dienst über COM (DLL realisiert COM-Client) den COM-Server (die Anwendung) ausführt, damit niemand sich am Rechner anmelden muss, um die Anwendung zu starten.


Noch ein Querverweis zu diesem Problem: Windows-Dienst als COM-Client. Geht das überhaupt???

In der COM-Client-DLL ist der Aufruf wie folgt (ist zwar C++, dürfte aber wohl nichts zur Sache tun, oder?):

...
Delphi-Quellcode:
Mk_tlb::TCOMIMK_Main comobj;
        
HRESULT hr = CoCreateInstance( Mk_tlb::CLSID_MK_Main, // {82031DB1-8955-4731-9AF6-08121F2331AB}
                  NULL,
                  CLSCTX_LOCAL_SERVER, // CLSCTX_ALL geht auch
                  Mk_tlb::IID_IMK_Main, // {D676B71E-0ACF-427A-A40E-23CCDECDFA29}
                  (void**)
                  &comobj );

bool ok = SUCCEEDED( hr ); // Fehler -2147221008
...

Geändert von Bernhard68 ( 2. Mär 2011 um 13:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#4

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 13:23
2. DLL als COM-Client
Dies wird üblicherweise in COM als Proxy bezeichnet.

Wenn ich über den Dienst, auch wenn er im Administrator-Benutzerkonto läuft,
in der DLL "CoCreateInstance" aufrufe, bekomme ich den Fehlerwert "-2147221008" zurück.
Der Hexadezimalwert ist interessanter: 800401F0. 8 am Anfang sagt uns daß es ein Fehler ist (es ist schließlich in COM immer ein HRESULT). Da das obere Word nicht 8007 ist, ist dies auch kein Win32-Fehler. Da hilft nur der Weg über MSDN-Library durchsuchenFormatMessage um dem Fehler eine sinnvolle Beschreibung zu entlocken
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Bernhard68

Registriert seit: 2. Mär 2011
4 Beiträge
 
#5

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 13:51
Danke für die Idee mit FormatMessage, Assarbad. manchmal sieht man den Wald vor lauter Bäumen nicht mehr.

Die Fehlermeldung 800401F0 "CoInitialize wurde nicht aufgerufen.\r\n" ist da leider auch nicht Zielführend. Schade.

Im Thread Windows-Dienst als COM-Client. Geht das überhaupt??? wurde eine evt. fehlende Berechtigung zur Ausführung von COM-Objekten erwähnt. Eine Gruppe zur Berechtigung für DCOM habe ich gefunden, aber das ist nicht was ich suche, oder doch?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.235 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 14:08
Die Fehlermeldung 800401F0 "CoInitialize wurde nicht aufgerufen.\r\n" ist da leider auch nicht Zielführend. Schade.
Wieso nicht Zielführend? Rufst du für den Thread in der der Com-Server läuft CoInitialize auf?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#7

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 14:56
Die Fehlermeldung 800401F0 "CoInitialize wurde nicht aufgerufen.\r\n" ist da leider auch nicht Zielführend. Schade.
Wieso nicht Zielführend? Rufst du für den Thread in der der Com-Server läuft CoInitialize auf?
@Bernhard68: Um es nochmal zu betonen, das ist per Thread.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Bernhard68

Registriert seit: 2. Mär 2011
4 Beiträge
 
#8

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 16:12
Das wars: CoInitialize wurde nicht aufgerufen!!!

Puh, es läuft.

Der Dienst startet das Programm und die Kommunikation läuft.
Der Dienst ist noch in "Lokales System" angemeldet und man
sieht die gestartete Anwendung nicht, aber das kriege ich bestimmt auch noch hin.

Vielen Dank für die Hilfe!!!

Mit großer Erleichterung

Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.235 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Zugriff auf einen COM-Server aus einem Delphi-Dienst

  Alt 2. Mär 2011, 16:16
Das wars: CoInitialize wurde nicht aufgerufen!!!
Zwischen der 5er und 6er Version wurde das Aufrufen von CoInitialize geändert. "Früher" wurde immer irgendwann mal CoInitialize aufgerufen. Ab der 6er Version wurde das z.B. mittels Application.Initialize erledigt.


Der Dienst startet das Programm und die Kommunikation läuft.
Der Dienst ist noch in "Lokales System" angemeldet und man
sieht die gestartete Anwendung nicht, aber das kriege ich bestimmt auch noch hin.
Eher nicht. Hier hat MS änderungen ab Vista vorgenommen. Hier solltest du eine "Notify" Anwendung vorsehen die unabhängig von der Dienste-Anwendung läuft.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz