DER ATL-Dienst mit _ATL_NO_COM_SUPPORT wird nicht gestartet.
Dieser Artikel hilft Ihnen bei der Behebung des Problems, bei dem der Assistent für die aktive Vorlagenbibliothek (Active Template Library, ATL) Project nicht als Dienst gestartet wird, nachdem Sie ein STANDARD-ATL-Dienstprojekt erstellt haben.
Originalversion des Produkts: Visual Studio 2010
Ursprüngliche KB-Nummer: 2480736
Problembeschreibung
Nachdem Sie ein STANDARD-ATL-Dienstprojekt mithilfe des ATL-Project-Assistenten erstellt haben, registrieren Sie den Dienst mit dem /Service Befehlszeilenparameter und versuchen dann, den Dienst mit net startzu starten. Der Dienst wird gestartet und dann sofort mit der folgenden Meldung beendet:
Der Dienst konnte nicht gestartet werden.
c:\>net start ATLService
The ATLService service is starting........
The ATLService service could not be started.
The service did not report an error.
Ursache
Die Basisklassenbibliotheken des ATL-Diensts rufen die Win32-Methode SetServiceStatus(SERVICE_RUNNING) nicht auf, wenn im Dienst keine COM-Objekte (ATL Component Object Model) implementiert sind.
Lösung
Der ATL-Dienst ist in erster Linie als Diensthost für COM-Objekte konzipiert, sodass erwartet wird, dass der Entwickler dem Dienst COM-Objekte hinzufügt.
Es ist jedoch möglich, ATL ohne COM zu verwenden. Es gibt z. B. ein _ATL_NO_COM_SUPPORT Makro, das Sie definieren können, um die Unterstützung für die Registrierung und Implementierung von COM-Objekten in der ATL-Bibliothek zu deaktivieren.
Aufgrund eines Fehlers in den Basisklassen des Diensts wird der _ATL_NO_COM_SUPPORT SetServiceStatus(SERVICE_RUNNING)-Aufruf nicht ausgeführt, und der Dienst wird gestartet und dann sofort beendet.
Sie können diesen Fehler umgehen, indem Sie die Funktion in der PreMessageLoop CAtlServiceModule abgeleiteten Klasse überschreiben und Folgendes aufrufen SetServiceStatus:
HRESULT PreMessageLoop(int nShowCmd)
{
SetServiceStatus(SERVICE_RUNNING);
return __super::PreMessageLoop(nShowCmd);
}
Hinweis
Diese PreMessageLoop Außerkraftsetzung ist nur für ATL-Dienste relevant, die definiert wurden _ATL_NO_COM_SUPPORT .
Weitere Informationen
Erstellen Sie mit dem Projekt-Assistenten eine neue ATL-Project.
Nennen Sie das Projekt "ATLService", und wählen Sie im Einstellungen "Anwendung" die Option "Dienst" aus.
Öffnen Sie die Datei "stdafx.h", und definieren Sie
_ATL_NO_COM_SUPPORTvor header-Anweisungen#include:#define _ATL_NO_COM_SUPPORTErstellen Sie das Projekt.
Registrieren Sie den Dienst in einem Konsolenfenster:
ATLService /serviceStarten Sie den Dienst:
c:\>net start ATLService The ATLService service is starting. The ATLService service could not be started. The service did not report an error.Fügen Sie den Problemumgehungscode hinzu, und erstellen Sie den Dienst neu. Möglicherweise müssen Sie den Dienst auch erneut registrieren.
Starten Sie den Dienst erneut:
c:\>net start ATLService The ATLService service is starting. The ATLService service was started successfully.