Frage

Ich versuche, einen anderen Prozess von einem Dienst zu starten (es ist eine Konsole-Anwendung, die einige Daten und schreibt sie in der Registry speichert), aber aus irgendeinem Grund kann ich es nicht richtig starten bekommen.

I Grundlagen dessen, was ich bin versucht zu tun ist wie folgt:

  1. Starten Sie den Prozess
  2. Warten, bis der Prozess
  3. beenden
  4. Rufen Sie den Return-Code aus dem Prozess

Ich bin derzeit mit dem folgenden Code:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::WaitForSingleObject(processInfo.hProcess, INFINITE);

    DWORD exit = 100;
    GetExitCodeProcess(processInfo.hProcess, &exit);

    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);

    return exit;
}

Nach dem Aufruf Createprocess (), gelingt es und tritt in den Körper der if-Anweisung. Der Aufruf von WaitForSingleObject kehrt sofort zurück, was es soll nicht, wie der Prozess etwa 20-30 Sekunden dauern sollte zu beenden. Und schließlich ruft GetExitCodeProcess () fehlschlägt und stellen nicht den Wert „exit“.

FYI, ist dieser Code Ich habe an anderer Stelle mit Erfolg tatsächlich verwendet wird, nur nicht in einem Service.

Könnte es sein, dass es von einem Dienst gestartet ist wird und es gibt Probleme mit Berechtigungen ??

Edit: Ich habe erkannt, dass es jetzt die App tatsächlich starten wird (ich es in TaskMan sehen kann), aber es scheint zu. Es ist da, aber nichts zu tun.
Basierend auf Rob Kennedy Vorschlag , fest ich den Prozess handelt Problem, und es eigentlich nicht warten, bis der Vorgang abgeschlossen ist. Aber es ist nie fertig, wenn ich es manuell zu töten.

War es hilfreich?

Lösung

WaitForSingleObject und GetExitCodeProcess erwarten, dass der Prozess Griff selbst, nicht ein Zeiger auf das Prozesshandle. Entfernen Sie die Et-Zeichen.

Überprüfen Sie auch die Rückgabewerte und rufen GetLastError, wenn sie scheitern. Das wird Ihnen helfen, zukünftige Probleme zu diagnostizieren. Nehmen Sie nie an eine API-Funktion wird immer erfolgreich sein.

Wenn Sie die Funktionen direkt aufrufen und die neuen Prozess startet, aber macht keine Fortschritte, können Sie ziemlich sicher sein, dass das Code ist nicht der Schuldige. Das Problem liegt in dem neuen Prozess, so konzentrieren Sie Ihre Debugging-Aufgaben gibt, nicht im Serviceprozess.

Andere Tipps

Nach dem Update und bearbeitet, das klingt wie ein von vielen möglichen Fallstricke, wenn ein Prozess von einem Dienst zu starten. Gibt es eine Möglichkeit - jede auch immer -, dass Ihr externes Verfahren zur Interaktion mit dem Benutzer wartet? Es gibt drei wichtige Beispiele, die ich denken kann, eine zum Beispiel eine Befehlszeilenanwendung sein würde, die möglicherweise unter bestimmten Umständen Tastatureingabe erfordern (zum Beispiel so etwas wie „cmd / c del *. *“ Würde Benutzerbestätigung erforderlich). Die anderen Beispiele würde gelten, wenn die Anwendung ein Fenster benötigt, und ist es angezeigt wird, aber Sie können es nicht sehen. Wenn das der Fall ist, könnten Sie Ihren Dienst auf „mit dem Desktop interagieren“, während des Debuggen und dann in der Lage sein, entweder das Anwendungsfenster (oder eine unerwartete Windows-Fehlermeldung wie nicht in der Lage, ein DLL oder ähnliches zu finden) zu sehen.

Wenn dies hilft Ihnen, zu debuggen oder nicht, in der Regel die „a-ha!“ Moment kommt aus zu erkennen, dass Dinge wie Umgebungsvariablen, Pfad, aktuelle Verzeichnis, und so weiter sind vielleicht nicht, was Sie aus Ihrem Service erwarten würde. Berechtigungen sind nicht der häufigste Grund für diese Art von Problem. Könnten Sie einige Details über die externe Anwendung bereitstellen starten Sie versuchen, vielleicht helfen, dass würde diese aus in denken.

Da Sie eine Konsolenanwendung starten, es ist möglich, dass es versteckte Startup-Code versucht, eine Konsole zu initialisieren. Ein Dienst wird nicht auf den Desktop angebracht, und ich bin sicher, dass ein Prozess, durch den Dienst gestartet wird nicht sein, so wird es nicht eine Konsole erstellen kann, zu. Das könnte der Punkt sein, wo es hängt.

Wenn Sie können, versuchen Sie Ihren Prozess in eine vollständige ausführbaren Windows-Datei zu ändern, aber den Teil überspringen, wo Sie versuchen, ein Fenster zu erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top