Prozessproblem...



  • ähh? Wie meinst du das? 🙄



  • Hattest du das WaitForSingleObject in deinem Testprogramm eigentlich auch eingebaut?



  • Ja na sicher hatte ich das da eingebaut, sonst würde ich mich ja nicht so wundern (ich habs mit WaitForSingleObject UND WaitForSingleObjectEx probiert, und das Testprogramm einmal in einer Konsolen- und einmal in einer WinAPI-Version (wiefolgt) implementiert):

    #include <windows.h>
    #include <string.h>
    #include <fstream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #pragma hdrstop
    #include <condefs.h>
    
    //---------------------------------------------------------------------------
    #pragma argsused
    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
                    STARTUPINFO si;
                    PROCESS_INFORMATION pi;
                    SECURITY_ATTRIBUTES saProcess;
                    ZeroMemory( &si, sizeof(si) );
                    si.cb = sizeof(si);
                    ZeroMemory( &pi, sizeof(pi) );
                    si.dwFlags = STARTF_USESHOWWINDOW;
    
                    saProcess.nLength = sizeof(saProcess);
                    saProcess.lpSecurityDescriptor = NULL;
                    saProcess.bInheritHandle = FALSE;
    
                    si.wShowWindow = SW_SHOW;
    
                    /*Lasst euch hiervon nicht irritieren, bei mir im Hauptprogramm
                    geschieht der aufruf nunmal fast so ;), deshlab string und
                    ein Array of Char ;) */
    
                    char text[1024+1];
                    string TempStr1 = "D:\\Programme\\Microsoft Office\\Office\\excel.exe";
                    strcpy(text, TempStr1.c_str());
                    MessageBox(NULL, "Starting process...", "", 0);
                    if( !CreateProcess( NULL, text, &saProcess, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
                    {
                            return -1;
                    }
                    else
                    {
                            DWORD dwCode = WaitForSingleObjectEx(pi.hProcess,INFINITE, false);
                            GetExitCodeProcess(pi.hProcess,&dwCode);
                    }
                    MessageBox(NULL, "Done", "", 0);                
            return 0;
    }
    


  • Hey,
    wozu brauchst du das WaitForSingleObject eigentlich? Gibt es vielleicht eine andere Möglichkeit als CreateProcess? ZB WinExec? Sag doch mal konkret was du erreichen willst...man muss ja nicht immer das Problem aus dem Weg schaffen sondern kann einen anderen Weg außenrum wählen 🙂

    Gruß,
    Kevin



  • @Surkevin: Ich will ein Programm so starten, dass das startende Programm wartet, bis das gestartete Programm beendet wurde - danach soll es normal weiterlaufen. Zudem benötige ich den Rückgabewert des gestarteten Programms (GetExitCodeProcess()) und es sollen Modis wie SW_SHOW, SW_HIDE, SW_MINIMIZED usw. übergeben werden können - das alles bieten ja Prozesse - nur hab ich da (oder Windows :D) wohl irgend einen Bug, denn es geht ja im kleinen Testprogramm aber nicht im großem Hauptprogramm. Da es ja im kleinen geht muss es ja mit meinem Hauptprogramm zu tun haben, nur kann es da 1000de Faktoren geben die das (irgendwie) beeinflussen können ... Hmmmm ... und WinExec() erlaubt nicht das Warten bis eine Anwendung beendet wurde, hab ich jedenfalls noch nie gehört.

    Als denn, gute Nacht 😉

    code_pilot



  • Hallo,

    PSDK schrieb:

    Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.

    Wozu braucht man noch WinExec?

    MfG
    tuküe



  • Der Einfachkeithalber?
    Hast du mal Rebuild All gemacht? Im Release und Debugmodus ausprobiert und es verschiedene Betriebssysteme/Computer getestet? Spiel mal ein bisschen mit den Parametern bei CreateProcess rum...andere Priority etc.
    Gruß,
    Kevin



  • ich glaube nicht daß das Problem am Speicherverbrauch o.ä. liegt. Die einzelnen Office-Anwendungen versuchen jam, mit einer Anwendung auszukommen.

    D.h: Du öffnest ein Dokument in Word, und doppelklickst ein zweites. Word wird zwar Zwei Einträge in der Taskleiste anzeigen (seit Word 2000 glaub ich), aber es gibt nur einen Prozeß (Taskmanager, Prozeßliste).

    jetzt Schritt 2: In Word Hilfe/Info... (modalen Dialog öffnen), und Word-Dokument doppelklicken. Word kommt in den Vordergrund, aber nix passiert - bis du den Modalen Dialog schließt. Interessanterweise läuft die ganze Zeit keine zweite Instanz, obwohl der "Öffnen" Befehl eine startet - ich vermute (auch aus anderen Gründen), Office startet für jedes Dokument einen eigenen thread.

    Nun versteh ich trotzdem nicht wieso das auch zwischen Excfel und Word passiert. Aber ich denke, daß Du den Office-Dokumenthandler irgendwie "durcheiunanderbringst".

    Also kleine Ahnung, aber ich denke das Problem liegt in der Richtung 😉



  • manche programme (hauptsächlich grössere MS sachen wie IE, oder eben office) "vertragen" es nicht, wenn man auf sie mit WaitForSingleObject wartet

    keine ahnung warum, ist mir aber auch schon öfters aufgefallen

    und ich glaube, da kann man nix gegen machen



  • hmk

    "Sometimes applications broadcast messages to some or all other windows on the system. In this event the above method will cause a deadlock situation if the waiting application is not free to process messages. If the waiting application is waiting in its thread that processes window messages, then no messages can be processed until the wait is complete."

    deine app muss also fenstermessages weiterverarbeiten, wasse aber nich macht
    probiers mal damit

    while (::PeekMessage (&message.msg, NULL, 0, 0, PM_NOREMOVE))
    {
    if (::GetMessage(&message.msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    if (WaitForSingleObject(xPi.hProcess, 0)
    break;
    }



  • @0rp: Hört sich ja net schlecht an. Aber wie muss ich denn jetzt da einbauen? Ne komplett neue WndProc basteln oder wie sieht das aus? Wo muss das WaitForSingleObject() hin?

    Danke & Grüsse, ~cp



  • du musst dein Wait.. durch den oben genannten code ersetzen.

    weil die schleife returned erst, wenn der prozess weg ist, arbeitet aber zusätzlich noch wnd messages weiter ab.



  • @0rp:

    Tut mir leid, er startet zwar das Programm, aber fährt dann einfach fort und wartet nicht. Mein Code:

    //WaitForSingleObject( pi.hProcess, INFINITE );
                            MSG message;
                            while (PeekMessage (&message, NULL, 0, 0, PM_NOREMOVE))
                            {
                                    if (GetMessage(&message, NULL, 0, 0))
                                    {
                                            TranslateMessage(&message);
                                            DispatchMessage(&message);
                                    }
    
                                    if(WaitForSingleObject(pi.hProcess, 0)) break;
                            }
                            DWORD dwCode;
                            GetExitCodeProcess(pi.hProcess,&dwCode);
    
                            sprintf(text, "%d", dwCode);
    

    😞

    ~cp



  • ersetz mal die wait zeile durch

    if(WaitForSingleObject(pi.hProcess, 0) == WAIT_OBJECT_0) break;



  • macht doch keinen unterschied 🙂



  • sicher machts einen unterschied, WAIT_OBJECT_0 is ja 0 und nicht ungleich 0

    aber es wird trotzdem nicht funktionieren

    weiss jetzt auch nich, wie man das besser machen könnte



  • das ist 0? Ok nächstes mal schau ich nach dem define bevor ich so vorlaute Bemerkungen abgeb *schäm*



  • 0rp schrieb:

    weiss jetzt auch nich, wie man das besser machen könnte

    😞 🙄



  • du könntest im notfall ohne das WaitForSingleObject einen Timer erstellen der alle 0,5 Sekunden (oder vielleicht einen eigenen Thread?) überprüft, ob der Prozess noch existiert...



  • Habs grad mal getestet, geht aber immernoch nicht (übrigens teste ich derzeit Zuhause auf dem Rechner von meinen Eltern (ich selbst haber kein Office) die haben Office 95 (!) und da hat er genau dasselbe Problem wie mit 2000 auf der Arbeit...

    Mein Testcode:

    while(WaitForSingleObject(pi.hProcess, 100) == WAIT_TIMEOUT);
    

    @surkevin: du hast was geschrieben ohne das WaitForSingleObject() ... wie? Also wie kann ich noch überprüfen ob der Prozess noch läuft...

    Hmm...

    ~code_pilot


Anmelden zum Antworten