2009-09-16 11 views
7

Ich versuche, einen Windows-Dienst mit MingW zu bauen. Es benötigt Thread-sichere Ausnahmen, also habe ich das Linker-Flag -mthreads hinzugefügt. Die Anwendung funktioniert einwandfrei von der Befehlszeile, aber wenn ich versuche, es von services.msc zu starten, wird der 1054-Fehler ("der Dienst reagierte nicht auf die Start- oder Steuerelementanforderung in einer pünktlichen Weise") ausgelöst. Der Dienst startet, wenn ich es ohne die -mthreads Flag neu erstellen. Wie kann ich mit -mthreads arbeiten?Multithread-Windows-Dienst in MingW

Antwort

1

Ich frage mich, ob Sie es debuggen können, wenn es als Dienst ausgeführt wird. Es muss etwas Spooking Ihr Programm sein, wenn Service-Host es ausführt. Vielleicht versuchen Sie, einen Debugger an svchost.exe anzuhängen, zumindest können Sie sehen, welche Module geladen sind und vielleicht welche Ausnahme den Absturz verursacht.

+0

Das Hinzufügen eines Debuggers zu svchost.exe hat nicht geholfen. Der Dienst bekommt keine Chance zu starten. Der Fehler wird bereits davor ausgelöst. –

1

Wird Ihre Anwendung überhaupt überhaupt gestartet? Rufen Sie zu Beginn Ihrer main-Funktion einen Anruf an OutputDebugString (oder gleichwertig) an, um zu sehen, ob es sogar so weit kommt. (Greifen Sie DbgView von SysInternals, wenn Sie es nicht schon haben.)

Wenn es nicht so weit kommt, fangen wir an, nach dem Offensichtlichen zu suchen: ist es eine Sache der Anwendung, die Laufzeit-DLL nicht zu finden? Es könnte sein, dass Sie die reguläre Laufzeit in PATH haben, aber die MT-Version nicht finden kann. Das könnte das Verhalten erklären, das du beschreibst. Möglicherweise müssen Sie die MT-Laufzeit kopieren oder den PATH entsprechend aktualisieren.

+0

Die Anwendung startet nicht einmal. Aber es läuft von der Kommandozeile. Es kann also nicht das Problem mit den Laufzeitbibliotheken sein. –

+0

Wo ist die MT-Version der Laufzeitbibliotheken? Es sollte im Anwendungsverzeichnis sein. Vielleicht sind die Laufzeitbibliotheken im PATH verfügbar, wenn sie als Benutzer ausgeführt werden, aber nicht als System. Verwenden Sie depends.exe, um herauszufinden, auf welche DLLs Sie angewiesen sind. Sie können auch versuchen, die App als ein anderer Benutzer auszuführen. –

5

Ich vermute, -mthreads bringt eine Abhängigkeit von einer DLL, und diese DLL ist nicht auf dem Pfad, wenn es als Dienst ausgeführt wird. Wenn ich in meiner cygwin-Umgebung ein triviales Programm mit "-mno-cygwin -mthreads" kompiliere, bekomme ich eine Abhängigkeit von MINGWM10.DLL, die bei Ausführung als Dienst sicherlich nicht auf dem Pfad wäre. Wenn ich versuche, es ohne PATH-Set auszuführen, stürzt es beim Laden ab (und hinterlässt einen Turd im Application-Ereignisprotokoll).

Ich würde Ihre exe in Dependency Walker (http://www.dependencywalker.com) bringen, um zu sehen, was Sie beim Laden laden, und überprüfen Sie Ihre Windows-Ereignisprotokoll, um zu sehen, ob es Hinweise gibt. Wahrscheinlich müssen Sie eine Kopie der benötigten DLLs neben der ausführbaren Datei ablegen.

2

Sie benötigen mingwm10.dll im Arbeitsverzeichnis oder in [edit: system, not pro user] PATH, da C++ - Programme, die mit der Option -mthread kompiliert wurden, diese Abhängigkeit haben. Wenn Sie sicher sind, dass die Ausnahme niemals von Ihrem Code ausgelöst wird oder sich nicht über Ihren Stack ausbildet, verwenden Sie -fno-exception anstelle von -mthread, um die Abhängigkeit zu beheben.