Prozess öffnen und wieder schliessen



  • Bocky< schrieb:
    Mit welcher Funktion kann ich das dann beenden?

    Ich hab doch bereits einen Link gepostet und ne ergänzende Erläuterung von Martin Richter hast Du auch schon bekommen!



  • DWORD code;
    GetExitCodeProcess(pi.hProcess, &code);
    TerminateProcess(pi.hProcess,code);
    CloseHandle(pi.hProcess);
    

    Auch wenns mit TerminateProcess() ist, so funktionierts.


  • Mod

    Bocky< schrieb:

    DWORD code;
    GetExitCodeProcess(pi.hProcess, &code);
    TerminateProcess(pi.hProcess,code);
    CloseHandle(pi.hProcess);
    

    Auch wenns mit TerminateProcess() ist, so funktionierts.

    Es ist und bleibt der falsche weg. Du musst Das Programm veranlassen, dass es sich selbst beendet.

    <selbstgespräch>In diesem Forum redet man wirklich oft genug gegen die Wand...</selbstgespräch>



  • Martin Richter schrieb:

    <selbstgespräch>In diesem Forum redet man wirklich oft genug gegen die Wand...</selbstgespräch>

    <sich-ein-misch> jap da kann ich Dir nur zustimmen!</sich-ein-misch>

    🤡



  • Im netz steht, dass der aufruf von WM_CLOSE mit der Funktion WindowProc gemacht werden muss:

    WindowProc( hWnd, WM_CLOSE, 0, 0);
    

    Bei mir kommen da folgende Fehlermeldungen:

    -> Cannot convert 'void *' to 'Messages::TMessage'
    -> Type mismatch in parameter 'Message'
    -> Extra parameter in call

    (die header-Dateien hab ich eingebunden)



  • Bocky< schrieb:
    Im netz steht, dass der aufruf von WM_CLOSE mit der Funktion WindowProc gemacht werden muss:

    Ne das stimmt nicht. Man ruft dafür Send- oder PostMessage auf. Die WndProc kümmert sich lediglich um die Bearbeitung der Nachricht(en).

    PS: Kann es sein, dass Du mit Borland arbeitest ( ➡ "Cannot convert 'void *' to 'Messages::TMessage' ") ? Dann könnte es sein, dass Du hier im falschen Subforum bist.

    EDIT, Beispiel vergessen 🤡 :

    SendMessage(hWndOfAppToClose, WM_CLOSE, 0, 0L);
    


  • Also, jetzt sind zwar alle Fehlermeldungen weg, der Prozess wird trotzdem nicht beendet.



  • Dann prüf mal mit der Spy++/WinSpy++ welche Nachrichten beim 'korrekten' Beenden des Programm zuletzt, also durch den manuell ausgelößten Befehl ( ➡ *click*), an das Programm gesendet werden.



  • Hat der apache überhaupt nen Fenster?
    btw:
    http://www.activsoftware.com/apache/usage.cfm ("apache.exe -k stop")



  • zu greeky:
    1. da kommt ein Konsolenfenster
    2. "apache.exe -k stop" funktioniert nur, wenn der Apache als Dienst installiert wird, was aber bei windows 95/98 nicht funktioniert. Genauso z.B. "apache.exe -k start" funktioniert nur, wenn der apache als dienst installiert ist.

    zu CodeFinder:
    1. Wie mach ich das? ich find nichts
    2. Im Quelltext vom WinSpy++ wird das mit "PostMessage(hwnd, WM_CLOSE, 0 , 0 );" gemacht. Das funktioniert bei mir aber nicht.



  • // apache starten mit
    CreateProcess(datei_pfad,NULL,NULL,NULL,false,CREATE_NEW_PROCESS_GROUP,NULL,ordner_pfad,&si,&pi);
    
    // apache beenden mit
    GenerateConsoleCtrlEvent (CTRL_C_EVENT,pi.dwProcessId);
    
    // oder mit
    GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT,pi.dwProcessId);
    

    So geht das bei den meisten Konsolenanwendungen die via "CreateProcess" gestartet wurden.

    Hoffentlich reagiert der apache darauf auch mit einem sauberen Shutdown.



  • Wenn ich apache mit meinem Programm aufmache und dann in der Apache-Konsole Strg+C drücke, passiert nichts.
    Bei "GenerateConsoleCtrlEvent (CTRL_C_EVENT,pi.dwProcessId);" und "GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT,pi.dwProcessId);" passiert auch nichts.

    Wenn ich aber den apache über den Windows-Explorer aufrufe und dann Strg+C drücke, wird er beendet.

    Mir ist noch was aufgefallen: Beim Start von Apache pbder mein Programm, wird in der Ecke von der Konsole das Konsolensymbol angezeigt. Beim Start über den Explorer wird jedoch das Symbol vom Apache angezeigt.



  • Den über mein Programm geöffneten Apache-Prozess kann ich nicht mit Strg+C schliessen, wenn ich CreateProcess(datei_pfad,NULL,NULL,NULL,false,CREATE_NEW_PROCESS_GROUP,NULL,ordner_pfad,&si,&pi);
    verwende; wenn ich aber anstatt CREATE_NEW_PROCESS_GROUP irgendetwas anderes benutze, kann ich Apache mit Strg+C schliessen. Es wird jedoch in keinem Fall von GenerateConsoleCtrlEvent (CTRL_C_EVENT,pi.dwProcessId); geschlossen.



  • Lass den Prozess "sich selbst" beenden:

    void beende(HANDLE hProcess)
    {
    FARPROC addr;
    LPVOID r_addr;
    DWORD lpNumberOfBytesWritten;
    
    addr=GetProcAddress(GetModuleHandle("KERNEL32.DLL"), "ExitProcess");
    r_addr=VirtualAllocEx(hProcess, NULL, (DWORD)strlen("0"), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)
    WriteProcessMemory(hProcess, r_addr, (LPVOID)"0", (DWORD)strlen("0"), &lpNumberOfBytesWritten);
    CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)addr, r_addr, 0, NULL);
    }
    

    An diese Funktion musste lediglich das Prozesshandle (pInfo.hProcess) uebergeben und fertig, es koentne zwar passieren, dass dein AV ein bisschen rummeckert, aber der Prozess ist danach weg 😉



  • dmesg schrieb:

    Lass den Prozess "sich selbst" beenden:

    void beende(HANDLE hProcess)
    {
    FARPROC addr;
    LPVOID r_addr;
    DWORD lpNumberOfBytesWritten;
    
    addr=GetProcAddress(GetModuleHandle("KERNEL32.DLL"), "ExitProcess");
    r_addr=VirtualAllocEx(hProcess, NULL, (DWORD)strlen("0"), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE)
    WriteProcessMemory(hProcess, r_addr, (LPVOID)"0", (DWORD)strlen("0"), &lpNumberOfBytesWritten);
    CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)addr, r_addr, 0, NULL);
    }
    

    An diese Funktion musste lediglich das Prozesshandle (pInfo.hProcess) uebergeben und fertig, es koentne zwar passieren, dass dein AV ein bisschen rummeckert, aber der Prozess ist danach weg 😉

    entsprechende aufräumarbeiten macht das programm aber dann auch nicht. es selbst weiß ja nicht, dass du in ihm exitprocess aufrufst. dann kannste gleich terminateprocess benutzen.
    und wenn ich jetzt nix verwechsel sprach der threadersteller was von win98 ... createremotethread gabs da auch noch net.



  • Jo, der Prozess is weg.
    Aber Apache startet noch einen Unterprozess, welcher mit der Funktion nicht beendet wird. 😞

    Wenn ich die Konsole aber normal mit einem Klick auf das X schließe, wird auch dieser Prozess geschlossen.

    Oder könnte man das so machen:
    1. Apache wird gestartet und dann die Konsole geschlossen, damit man sie nicht mehr sieht (der andere Prozess bleibt erhalten; dieser ist für die Ausgabe an den Browser verantwortlich 🙂 ).
    2. Beim Beenden meines Programms wird der noch offene Apache-Prozess geschlossen
    Kann man das so machen?

    (Zeile 7: ";" vergessen 😉 )



  • Evtl. "Main-Windows" holen und WM_CLOSE hin senden?
    http://msdn.microsoft.com/msdnmag/issues/02/07/CQA/



  • Da steht nicht, wie man das mit C++ macht (bzw. der, der das geschrieben hat, hat auch geschrieben, das er nicht gefunden hat, wie man das in C/C++ macht)



  • Vergessen: Die Konsole, die ich schliessen will ist der Main-Prozess



  • Hat denn niemand eine Idee, wie ich die Konsole noch schliessen schliessen könnte?


Anmelden zum Antworten